mpu6050.c 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036
  1. /* MPU6050 motion sensor driver
  2. *
  3. * This software is licensed under the terms of the GNU General Public
  4. * License version 2, as published by the Free Software Foundation, and
  5. * may be copied, distributed, and modified under those terms.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. */
  13. #include <cust_gyro.h>
  14. #include "mpu6050.h"
  15. #include <gyroscope.h>
  16. #include <hwmsensor.h>
  17. #include <mt_boot_common.h>
  18. #define INV_GYRO_AUTO_CALI 1
  19. /*----------------------------------------------------------------------------*/
  20. #define MPU6050_DEFAULT_FS MPU6050_FS_1000
  21. #define MPU6050_DEFAULT_LSB MPU6050_FS_1000_LSB
  22. /*----------------------------------------------------------------------------*/
  23. #define CONFIG_MPU6050_LOWPASS /*apply low pass filter on output */
  24. /*----------------------------------------------------------------------------*/
  25. #define MPU6050_AXIS_X 0
  26. #define MPU6050_AXIS_Y 1
  27. #define MPU6050_AXIS_Z 2
  28. #define MPU6050_AXES_NUM 3
  29. #define MPU6050_DATA_LEN 6
  30. #define MPU6050_DEV_NAME "MPU6050GY" /* name must different with gsensor mpu6050 */
  31. /*----------------------------------------------------------------------------*/
  32. static const struct i2c_device_id mpu6050_i2c_id[] = {{MPU6050_DEV_NAME, 0}, {} };
  33. int packet_thresh = 75; /* 600 ms / 8ms/sample */
  34. /* Maintain cust info here */
  35. struct gyro_hw gyro_cust;
  36. static struct gyro_hw *hw = &gyro_cust;
  37. struct platform_device *gyroPltFmDev;
  38. /* For driver get cust info */
  39. struct gyro_hw *get_cust_gyro(void)
  40. {
  41. return &gyro_cust;
  42. }
  43. /*----------------------------------------------------------------------------*/
  44. static int mpu6050_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
  45. static int mpu6050_i2c_remove(struct i2c_client *client);
  46. static int mpu6050_i2c_detect(struct i2c_client *client, struct i2c_board_info *info);
  47. #if !defined(CONFIG_HAS_EARLYSUSPEND)
  48. static int mpu6050_suspend(struct i2c_client *client, pm_message_t msg);
  49. static int mpu6050_resume(struct i2c_client *client);
  50. #endif
  51. static int mpu6050_local_init(struct platform_device *pdev);
  52. static int mpu6050_remove(void);
  53. static int mpu6050_init_flag = -1; /* 0<==>OK -1 <==> fail */
  54. static struct gyro_init_info mpu6050_init_info = {
  55. .name = "mpu6050GY",
  56. .init = mpu6050_local_init,
  57. .uninit = mpu6050_remove,
  58. };
  59. /*----------------------------------------------------------------------------*/
  60. enum {
  61. GYRO_TRC_FILTER = 0x01,
  62. GYRO_TRC_RAWDATA = 0x02,
  63. GYRO_TRC_IOCTL = 0x04,
  64. GYRO_TRC_CALI = 0X08,
  65. GYRO_TRC_INFO = 0X10,
  66. GYRO_TRC_DATA = 0X20,
  67. };
  68. /*----------------------------------------------------------------------------*/
  69. struct scale_factor {
  70. u8 whole;
  71. u8 fraction;
  72. };
  73. /*----------------------------------------------------------------------------*/
  74. struct data_resolution {
  75. struct scale_factor scalefactor;
  76. int sensitivity;
  77. };
  78. /*----------------------------------------------------------------------------*/
  79. #define C_MAX_FIR_LENGTH (32)
  80. /*----------------------------------------------------------------------------*/
  81. struct data_filter {
  82. s16 raw[C_MAX_FIR_LENGTH][MPU6050_AXES_NUM];
  83. int sum[MPU6050_AXES_NUM];
  84. int num;
  85. int idx;
  86. };
  87. /*----------------------------------------------------------------------------*/
  88. struct mpu6050_i2c_data {
  89. struct i2c_client *client;
  90. struct gyro_hw *hw;
  91. struct hwmsen_convert cvt;
  92. /*misc */
  93. struct data_resolution *reso;
  94. atomic_t trace;
  95. atomic_t suspend;
  96. atomic_t selftest;
  97. atomic_t filter;
  98. s16 cali_sw[MPU6050_AXES_NUM + 1];
  99. /*data */
  100. s8 offset[MPU6050_AXES_NUM + 1]; /*+1: for 4-byte alignment */
  101. s16 data[MPU6050_AXES_NUM + 1];
  102. #if defined(CONFIG_MPU6050_LOWPASS)
  103. atomic_t firlen;
  104. atomic_t fir_en;
  105. struct data_filter fir;
  106. #endif
  107. /*early suspend */
  108. #if defined(CONFIG_HAS_EARLYSUSPEND)
  109. struct early_suspend early_drv;
  110. #endif
  111. #if INV_GYRO_AUTO_CALI == 1
  112. s16 inv_cali_raw[MPU6050_AXES_NUM + 1];
  113. s16 temperature;
  114. struct mutex temperature_mutex; /* for temperature protection */
  115. struct mutex raw_data_mutex; /* for inv_cali_raw[] protection */
  116. #endif
  117. };
  118. #ifdef CONFIG_OF
  119. static const struct of_device_id gyro_of_match[] = {
  120. {.compatible = "mediatek,gyro"},
  121. {},
  122. };
  123. #endif
  124. /*----------------------------------------------------------------------------*/
  125. static struct i2c_driver mpu6050gy_i2c_driver = {
  126. .driver = {
  127. .name = MPU6050_DEV_NAME,
  128. #ifdef CONFIG_OF
  129. .of_match_table = gyro_of_match,
  130. #endif
  131. },
  132. .probe = mpu6050_i2c_probe,
  133. .remove = mpu6050_i2c_remove,
  134. .detect = mpu6050_i2c_detect,
  135. #if !defined(CONFIG_HAS_EARLYSUSPEND)
  136. .suspend = mpu6050_suspend,
  137. .resume = mpu6050_resume,
  138. #endif
  139. .id_table = mpu6050_i2c_id,
  140. };
  141. /*----------------------------------------------------------------------------*/
  142. static struct i2c_client *mpu6050_i2c_client;
  143. static struct mpu6050_i2c_data *obj_i2c_data;
  144. static bool sensor_power;
  145. /*----------------------------------------------------------------------------*/
  146. #define MPU6050GY_DEBUG 0
  147. #define GYRO_FLAG "<GYRO> "
  148. #define GYRO_FUNC(f) pr_debug(GYRO_FLAG"%s\n", __func__)
  149. #define GYRO_ERROR(fmt, args...) pr_err(GYRO_FLAG fmt, ##args)
  150. #define GYRO_INFO(fmt, args...) pr_debug(GYRO_FLAG fmt, ##args)
  151. #if MPU6050GY_DEBUG
  152. #define GYRO_DBG(fmt, args...) pr_debug(GYRO_FLAG fmt, ##args)
  153. #else
  154. #define GYRO_DBG(fmt, args...)
  155. #endif
  156. /*----------------------------------------------------------------------------*/
  157. static unsigned int power_on;
  158. #if INV_GYRO_AUTO_CALI == 1
  159. /*
  160. devpath : "/sys/devices/virtual/invensense_daemon_class/invensense_daemon_device
  161. class : "/sys/class/invensense_daemon_class"
  162. inv_mpl_motion --
  163. sysfs : "/sys/class/invensense_daemon_class/invensense_daemon_device/inv_mpl_motion", 1:motion 0:no motion
  164. "/sys/devices/virtual/invensense_daemon_class/invensense_daemon_device/inv_mpl_motion", 1:motion 0:no motion
  165. inv_gyro_data_ready --
  166. sysfs : "/sys/class/invensense_daemon_class/invensense_daemon_device/inv_gyro_data_ready"
  167. "/sys/devices/virtual/invensense_daemon_class/invensense_daemon_device/inv_gyro_data_ready"
  168. inv_gyro_power_state --
  169. sysfs : "/sys/class/invensense_daemon_class/invensense_daemon_device/inv_gyro_power_state"
  170. "/sys/devices/virtual/invensense_daemon_class/invensense_daemon_device/inv_gyro_power_state"
  171. */
  172. #define INV_DAEMON_CLASS_NAME "invensense_daemon_class"
  173. #define INV_DAEMON_DEVICE_NAME "invensense_daemon_device"
  174. static struct class *inv_daemon_class;
  175. static struct device *inv_daemon_device;
  176. static int inv_mpl_motion_state; /* default is 0: no motion */
  177. static int inv_gyro_power_state;
  178. static ssize_t inv_mpl_motion_store(struct device *dev,
  179. struct device_attribute *attr, const char *buf, size_t count)
  180. {
  181. unsigned int result;
  182. unsigned long data;
  183. result = kstrtoul(buf, 10, &data);
  184. if (result)
  185. return result;
  186. /* if (inv_mpl_motion_state != data) */
  187. {
  188. char *envp[2];
  189. if (data)
  190. envp[0] = "STATUS=MOTION";
  191. else
  192. envp[0] = "STATUS=NOMOTION";
  193. envp[1] = NULL;
  194. result = kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
  195. inv_mpl_motion_state = data;
  196. }
  197. return count;
  198. }
  199. static ssize_t inv_mpl_motion_show(struct device *dev, struct device_attribute *attr, char *buf)
  200. {
  201. return sprintf(buf, "%d\n", inv_mpl_motion_state);
  202. }
  203. static ssize_t inv_gyro_data_ready_store(struct device *dev,
  204. struct device_attribute *attr, const char *buf,
  205. size_t count)
  206. {
  207. sysfs_notify(&dev->kobj, NULL, "inv_gyro_data_ready");
  208. return count;
  209. }
  210. static ssize_t inv_gyro_data_ready_show(struct device *dev,
  211. struct device_attribute *attr, char *buf)
  212. {
  213. return sprintf(buf, "1\n");
  214. }
  215. static ssize_t inv_gyro_power_state_store(struct device *dev,
  216. struct device_attribute *attr, const char *buf,
  217. size_t count)
  218. {
  219. unsigned int result;
  220. unsigned long data;
  221. result = kstrtoul(buf, 10, &data);
  222. if (result)
  223. return result;
  224. inv_gyro_power_state = data;
  225. sysfs_notify(&dev->kobj, NULL, "inv_gyro_power_state");
  226. return count;
  227. }
  228. static ssize_t inv_gyro_power_state_show(struct device *dev,
  229. struct device_attribute *attr, char *buf)
  230. {
  231. return sprintf(buf, "%d\n", inv_gyro_power_state);
  232. }
  233. static DEVICE_ATTR(inv_mpl_motion, S_IRUGO | S_IWUSR, inv_mpl_motion_show, inv_mpl_motion_store);
  234. static DEVICE_ATTR(inv_gyro_data_ready, S_IRUGO | S_IWUSR, inv_gyro_data_ready_show, inv_gyro_data_ready_store);
  235. static DEVICE_ATTR(inv_gyro_power_state, S_IRUGO | S_IWUSR, inv_gyro_power_state_show, inv_gyro_power_state_store);
  236. static struct device_attribute *inv_daemon_dev_attributes[] = {
  237. &dev_attr_inv_mpl_motion,
  238. &dev_attr_inv_gyro_data_ready,
  239. &dev_attr_inv_gyro_power_state,
  240. };
  241. #endif /* #if INV_GYRO_AUTO_CALI == 1 */
  242. int MPU6050_gyro_power(void)
  243. {
  244. return power_on;
  245. }
  246. EXPORT_SYMBOL(MPU6050_gyro_power);
  247. int MPU6050_gyro_mode(void)
  248. {
  249. return sensor_power;
  250. }
  251. EXPORT_SYMBOL(MPU6050_gyro_mode);
  252. /*--------------------gyroscopy power control function----------------------------------*/
  253. static void MPU6050_power(struct gyro_hw *hw, unsigned int on)
  254. {
  255. }
  256. /*----------------------------------------------------------------------------*/
  257. /*----------------------------------------------------------------------------*/
  258. static int MPU6050_write_rel_calibration(struct mpu6050_i2c_data *obj, int dat[MPU6050_AXES_NUM])
  259. {
  260. obj->cali_sw[MPU6050_AXIS_X] = obj->cvt.sign[MPU6050_AXIS_X]*dat[obj->cvt.map[MPU6050_AXIS_X]];
  261. obj->cali_sw[MPU6050_AXIS_Y] = obj->cvt.sign[MPU6050_AXIS_Y]*dat[obj->cvt.map[MPU6050_AXIS_Y]];
  262. obj->cali_sw[MPU6050_AXIS_Z] = obj->cvt.sign[MPU6050_AXIS_Z]*dat[obj->cvt.map[MPU6050_AXIS_Z]];
  263. #if MPU6050GY_DEBUG
  264. if (atomic_read(&obj->trace) & GYRO_TRC_CALI) {
  265. GYRO_DBG("test (%5d, %5d, %5d) ->(%5d, %5d, %5d)->(%5d, %5d, %5d))\n",
  266. obj->cvt.sign[MPU6050_AXIS_X], obj->cvt.sign[MPU6050_AXIS_Y], obj->cvt.sign[MPU6050_AXIS_Z],
  267. dat[MPU6050_AXIS_X], dat[MPU6050_AXIS_Y], dat[MPU6050_AXIS_Z],
  268. obj->cvt.map[MPU6050_AXIS_X], obj->cvt.map[MPU6050_AXIS_Y], obj->cvt.map[MPU6050_AXIS_Z]);
  269. GYRO_DBG("write gyro calibration data (%5d, %5d, %5d)\n",
  270. obj->cali_sw[MPU6050_AXIS_X], obj->cali_sw[MPU6050_AXIS_Y], obj->cali_sw[MPU6050_AXIS_Z]);
  271. }
  272. #endif
  273. return 0;
  274. }
  275. /*----------------------------------------------------------------------------*/
  276. static int MPU6050_ResetCalibration(struct i2c_client *client)
  277. {
  278. struct mpu6050_i2c_data *obj = i2c_get_clientdata(client);
  279. memset(obj->cali_sw, 0x00, sizeof(obj->cali_sw));
  280. return 0;
  281. }
  282. /*----------------------------------------------------------------------------*/
  283. static int MPU6050_ReadCalibration(struct i2c_client *client, int dat[MPU6050_AXES_NUM])
  284. {
  285. struct mpu6050_i2c_data *obj = i2c_get_clientdata(client);
  286. dat[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*obj->cali_sw[MPU6050_AXIS_X];
  287. dat[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*obj->cali_sw[MPU6050_AXIS_Y];
  288. dat[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*obj->cali_sw[MPU6050_AXIS_Z];
  289. #if MPU6050GY_DEBUG
  290. if (atomic_read(&obj->trace) & GYRO_TRC_CALI) {
  291. GYRO_DBG("Read gyro calibration data (%5d, %5d, %5d)\n",
  292. dat[MPU6050_AXIS_X], dat[MPU6050_AXIS_Y], dat[MPU6050_AXIS_Z]);
  293. }
  294. #endif
  295. return 0;
  296. }
  297. /*----------------------------------------------------------------------------*/
  298. /*----------------------------------------------------------------------------*/
  299. static int MPU6050_WriteCalibration(struct i2c_client *client, int dat[MPU6050_AXES_NUM])
  300. {
  301. struct mpu6050_i2c_data *obj = i2c_get_clientdata(client);
  302. int err = 0;
  303. int cali[MPU6050_AXES_NUM];
  304. GYRO_FUNC();
  305. if (!obj || !dat) {
  306. GYRO_ERROR("null ptr!!\n");
  307. return -EINVAL;
  308. }
  309. cali[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*obj->cali_sw[MPU6050_AXIS_X];
  310. cali[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*obj->cali_sw[MPU6050_AXIS_Y];
  311. cali[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*obj->cali_sw[MPU6050_AXIS_Z];
  312. cali[MPU6050_AXIS_X] += dat[MPU6050_AXIS_X];
  313. cali[MPU6050_AXIS_Y] += dat[MPU6050_AXIS_Y];
  314. cali[MPU6050_AXIS_Z] += dat[MPU6050_AXIS_Z];
  315. #if MPU6050GY_DEBUG
  316. if (atomic_read(&obj->trace) & GYRO_TRC_CALI) {
  317. GYRO_DBG("write gyro calibration data (%5d, %5d, %5d)-->(%5d, %5d, %5d)\n",
  318. dat[MPU6050_AXIS_X], dat[MPU6050_AXIS_Y], dat[MPU6050_AXIS_Z],
  319. cali[MPU6050_AXIS_X], cali[MPU6050_AXIS_Y], cali[MPU6050_AXIS_Z]);
  320. }
  321. #endif
  322. return MPU6050_write_rel_calibration(obj, cali);
  323. return err;
  324. }
  325. /*----------------------------------------------------------------------------*/
  326. /*----------------------------------------------------------------------------*/
  327. static int MPU6050_ReadStart(struct i2c_client *client, bool enable)
  328. {
  329. u8 databuf[2] = { 0 };
  330. int res = 0;
  331. GYRO_FUNC();
  332. if (enable) {
  333. /* enable xyz gyro in FIFO */
  334. databuf[0] = (MPU6050_FIFO_GYROX_EN|MPU6050_FIFO_GYROY_EN|MPU6050_FIFO_GYROZ_EN);
  335. } else {
  336. /* disable xyz gyro in FIFO */
  337. databuf[0] = 0;
  338. }
  339. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  340. res = MPU6050_hwmsen_write_block(MPU6050_REG_FIFO_EN, databuf, 0x1);
  341. #else
  342. databuf[1] = databuf[0];
  343. databuf[0] = MPU6050_REG_FIFO_EN;
  344. res = i2c_master_send(client, databuf, 0x2);
  345. #endif
  346. if (res <= 0) {
  347. GYRO_ERROR(" enable xyz gyro in FIFO error,enable: 0x%x!\n", databuf[0]);
  348. return MPU6050_ERR_I2C;
  349. }
  350. GYRO_DBG("MPU6050_ReadStart: enable xyz gyro in FIFO: 0x%x\n", databuf[0]);
  351. return MPU6050_SUCCESS;
  352. }
  353. /* ----------------------------------------------------------------------------// */
  354. static int MPU6050_SetPowerMode(struct i2c_client *client, bool enable)
  355. {
  356. u8 databuf[2] = { 0 };
  357. int res = 0;
  358. if (enable == sensor_power) {
  359. GYRO_DBG("Sensor power status is newest!\n");
  360. return MPU6050_SUCCESS;
  361. }
  362. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  363. if (MPU6050_hwmsen_read_block(MPU6050_REG_PWR_CTL, databuf, 0x01)) {
  364. #else
  365. if (hwmsen_read_byte(client, MPU6050_REG_PWR_CTL, databuf)) {
  366. #endif
  367. GYRO_ERROR("read power ctl register err!\n");
  368. return MPU6050_ERR_I2C;
  369. }
  370. databuf[0] &= ~MPU6050_SLEEP;
  371. if (enable == false) {
  372. if (MPU6050_gse_mode() == false)
  373. databuf[0] |= MPU6050_SLEEP;
  374. } else {
  375. /* do nothing */
  376. }
  377. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  378. res = MPU6050_hwmsen_write_block(MPU6050_REG_PWR_CTL, databuf, 0x1);
  379. #else
  380. databuf[1] = databuf[0];
  381. databuf[0] = MPU6050_REG_PWR_CTL;
  382. res = i2c_master_send(client, databuf, 0x2);
  383. #endif
  384. if (res <= 0) {
  385. GYRO_ERROR("set power mode failed!\n");
  386. return MPU6050_ERR_I2C;
  387. }
  388. GYRO_DBG("set power mode ok %d!\n", enable);
  389. sensor_power = enable;
  390. return MPU6050_SUCCESS;
  391. }
  392. /*----------------------------------------------------------------------------*/
  393. static int MPU6050_SetDataFormat(struct i2c_client *client, u8 dataformat)
  394. {
  395. u8 databuf[2] = { 0 };
  396. int res = 0;
  397. /*GYRO_FUNC();*/
  398. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  399. databuf[0] = dataformat;
  400. res = MPU6050_hwmsen_write_block(MPU6050_REG_CFG, databuf, 0x1);
  401. #else
  402. databuf[0] = MPU6050_REG_CFG;
  403. databuf[1] = dataformat;
  404. res = i2c_master_send(client, databuf, 0x2);
  405. #endif
  406. if (res <= 0)
  407. return MPU6050_ERR_I2C;
  408. /* read sample rate after written for test */
  409. udelay(500);
  410. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  411. if (MPU6050_hwmsen_read_block(MPU6050_REG_CFG, databuf, 0x01)) {
  412. #else
  413. if (hwmsen_read_byte(client, MPU6050_REG_CFG, databuf)) {
  414. #endif
  415. GYRO_ERROR("read data format register err!\n");
  416. return MPU6050_ERR_I2C;
  417. }
  418. GYRO_DBG("read data format: 0x%x\n", databuf[0]);
  419. return MPU6050_SUCCESS;
  420. }
  421. static int MPU6050_SetFullScale(struct i2c_client *client, u8 dataformat)
  422. {
  423. u8 databuf[2] = { 0 };
  424. int res = 0;
  425. /*GYRO_FUNC();*/
  426. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  427. databuf[0] = dataformat;
  428. res = MPU6050_hwmsen_write_block(MPU6050_REG_GYRO_CFG, databuf, 0x1);
  429. #else
  430. databuf[0] = MPU6050_REG_GYRO_CFG;
  431. databuf[1] = dataformat;
  432. res = i2c_master_send(client, databuf, 0x2);
  433. #endif
  434. if (res <= 0)
  435. return MPU6050_ERR_I2C;
  436. /* read sample rate after written for test */
  437. udelay(500);
  438. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  439. if (MPU6050_hwmsen_read_block(MPU6050_REG_GYRO_CFG, databuf, 0x01)) {
  440. #else
  441. if (hwmsen_read_byte(client, MPU6050_REG_GYRO_CFG, databuf)) {
  442. #endif
  443. GYRO_ERROR("read scale register err!\n");
  444. return MPU6050_ERR_I2C;
  445. }
  446. GYRO_DBG("read scale register: 0x%x\n", databuf[0]);
  447. return MPU6050_SUCCESS;
  448. }
  449. /* set the sample rate */
  450. static int MPU6050_SetSampleRate(struct i2c_client *client, int sample_rate)
  451. {
  452. u8 databuf[2] = { 0 };
  453. int rate_div = 0;
  454. int res = 0;
  455. /*GYRO_FUNC();*/
  456. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  457. if (MPU6050_hwmsen_read_block(MPU6050_REG_CFG, databuf, 0x01)) {
  458. #else
  459. if (hwmsen_read_byte(client, MPU6050_REG_CFG, databuf)) {
  460. #endif
  461. GYRO_ERROR("read gyro sample rate register err!\n");
  462. return MPU6050_ERR_I2C;
  463. }
  464. GYRO_DBG("read gyro sample rate register: 0x%x\n", databuf[0]);
  465. if ((databuf[0] & 0x07) == 0) { /* Analog sample rate is 8KHz */
  466. rate_div = 8 * 1024 / sample_rate - 1;
  467. } else { /* 1kHz */
  468. rate_div = 1024 / sample_rate - 1;
  469. }
  470. if (rate_div > 255) { /* rate_div: 0 to 255; */
  471. rate_div = 255;
  472. } else if (rate_div < 0) {
  473. rate_div = 0;
  474. }
  475. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  476. databuf[0] = rate_div;
  477. res = MPU6050_hwmsen_write_block(MPU6050_REG_SAMRT_DIV, databuf, 0x1);
  478. #else
  479. databuf[0] = MPU6050_REG_SAMRT_DIV;
  480. databuf[1] = rate_div;
  481. res = i2c_master_send(client, databuf, 0x2);
  482. #endif
  483. if (res <= 0) {
  484. GYRO_ERROR("write sample rate register err!\n");
  485. return MPU6050_ERR_I2C;
  486. }
  487. /* read sample div after written for test */
  488. udelay(500);
  489. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  490. if (MPU6050_hwmsen_read_block(MPU6050_REG_SAMRT_DIV, databuf, 0x01)) {
  491. #else
  492. if (hwmsen_read_byte(client, MPU6050_REG_SAMRT_DIV, databuf)) {
  493. #endif
  494. GYRO_ERROR("read gyro sample rate register err!\n");
  495. return MPU6050_ERR_I2C;
  496. }
  497. GYRO_DBG("read gyro sample rate: 0x%x\n", databuf[0]);
  498. return MPU6050_SUCCESS;
  499. }
  500. /*----------------------------------------------------------------------------*/
  501. /*----------------------------------------------------------------------------*/
  502. static int MPU6050_FIFOConfig(struct i2c_client *client, u8 clk)
  503. {
  504. u8 databuf[2] = { 0 };
  505. int res = 0;
  506. GYRO_FUNC();
  507. /* use gyro X, Y or Z for clocking */
  508. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  509. databuf[0] = clk;
  510. res = MPU6050_hwmsen_write_block(MPU6050_REG_PWR_CTL, databuf, 0x1);
  511. #else
  512. databuf[0] = MPU6050_REG_PWR_CTL;
  513. databuf[1] = clk;
  514. res = i2c_master_send(client, databuf, 0x2);
  515. #endif
  516. if (res <= 0) {
  517. GYRO_ERROR("write Power CTRL register err!\n");
  518. return MPU6050_ERR_I2C;
  519. }
  520. GYRO_DBG("MPU6050 use gyro X for clocking OK!\n");
  521. mdelay(50);
  522. /* enable xyz gyro in FIFO */
  523. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  524. databuf[0] = (MPU6050_FIFO_GYROX_EN|MPU6050_FIFO_GYROY_EN|MPU6050_FIFO_GYROZ_EN);
  525. res = MPU6050_hwmsen_write_block(MPU6050_REG_FIFO_EN, databuf, 0x1);
  526. #else
  527. databuf[0] = MPU6050_REG_FIFO_EN;
  528. databuf[1] = (MPU6050_FIFO_GYROX_EN|MPU6050_FIFO_GYROY_EN|MPU6050_FIFO_GYROZ_EN);
  529. res = i2c_master_send(client, databuf, 0x2);
  530. #endif
  531. if (res <= 0) {
  532. GYRO_ERROR("write Power CTRL register err!\n");
  533. return MPU6050_ERR_I2C;
  534. }
  535. GYRO_DBG("MPU6050 enable xyz gyro in FIFO OK!\n");
  536. /* disable AUX_VDDIO */
  537. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  538. databuf[0] = MPU6050_AUX_VDDIO_DIS;
  539. res = MPU6050_hwmsen_write_block(MPU6050_REG_AUX_VDD, databuf, 0x1);
  540. #else
  541. databuf[0] = MPU6050_REG_AUX_VDD;
  542. databuf[1] = MPU6050_AUX_VDDIO_DIS;
  543. res = i2c_master_send(client, databuf, 0x2);
  544. #endif
  545. if (res <= 0) {
  546. GYRO_ERROR("write AUX_VDD register err!\n");
  547. return MPU6050_ERR_I2C;
  548. }
  549. GYRO_DBG("MPU6050 disable AUX_VDDIO OK!\n");
  550. /* enable FIFO and reset FIFO */
  551. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  552. databuf[0] = (MPU6050_FIFO_EN | MPU6050_FIFO_RST);
  553. res = MPU6050_hwmsen_write_block(MPU6050_REG_FIFO_CTL, databuf, 0x1);
  554. #else
  555. databuf[0] = MPU6050_REG_FIFO_CTL;
  556. databuf[1] = (MPU6050_FIFO_EN | MPU6050_FIFO_RST);
  557. res = i2c_master_send(client, databuf, 0x2);
  558. #endif
  559. if (res <= 0) {
  560. GYRO_ERROR("write FIFO CTRL register err!\n");
  561. return MPU6050_ERR_I2C;
  562. }
  563. GYRO_DBG("MPU6050_FIFOConfig OK!\n");
  564. return MPU6050_SUCCESS;
  565. }
  566. /*----------------------------------------------------------------------------*/
  567. static int MPU6050_ReadFifoData(struct i2c_client *client, s16 *data, int *datalen)
  568. {
  569. struct mpu6050_i2c_data *obj = i2c_get_clientdata(client);
  570. u8 buf[MPU6050_DATA_LEN] = {0};
  571. s16 tmp1[MPU6050_AXES_NUM] = {0};
  572. s16 tmp2[MPU6050_AXES_NUM] = {0};
  573. int err = 0;
  574. u8 tmp = 0;
  575. int packet_cnt = 0;
  576. int i;
  577. GYRO_FUNC();
  578. if (NULL == client)
  579. return -EINVAL;
  580. /* stop putting data in FIFO */
  581. MPU6050_ReadStart(client, false);
  582. /* read data number of bytes in FIFO */
  583. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  584. err = MPU6050_hwmsen_read_block(MPU6050_REG_FIFO_CNTH, &tmp, 0x01);
  585. #else
  586. err = hwmsen_read_byte(client, MPU6050_REG_FIFO_CNTH, &tmp);
  587. #endif
  588. if (err) {
  589. GYRO_ERROR("read data high number of bytes error: %d\n", err);
  590. return -1;
  591. }
  592. packet_cnt = tmp << 8;
  593. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  594. err = MPU6050_hwmsen_read_block(MPU6050_REG_FIFO_CNTL, &tmp, 0x01);
  595. #else
  596. err = hwmsen_read_byte(client, MPU6050_REG_FIFO_CNTL, &tmp);
  597. #endif
  598. if (err) {
  599. GYRO_ERROR("read data low number of bytes error: %d\n", err);
  600. return -1;
  601. }
  602. packet_cnt = (packet_cnt + tmp) / MPU6050_DATA_LEN;
  603. GYRO_DBG("MPU6050 Read Data packet number OK: %d\n", packet_cnt);
  604. *datalen = packet_cnt;
  605. /* Within +-5% range: timing_tolerance * packet_thresh=0.05*75 */
  606. if (packet_cnt && (abs(packet_thresh - packet_cnt) < 4)) {
  607. /* read data in FIFO */
  608. for (i = 0; i < packet_cnt; i++) {
  609. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  610. if (MPU6050_hwmsen_read_block(MPU6050_REG_FIFO_DATA, buf, MPU6050_DATA_LEN)) {
  611. #else
  612. if (hwmsen_read_block(client, MPU6050_REG_FIFO_DATA, buf, MPU6050_DATA_LEN)) {
  613. #endif
  614. GYRO_ERROR("MPU6050 read data from FIFO error: %d\n", err);
  615. return -2;
  616. } else
  617. GYRO_DBG("MPU6050 read Data of diff address from FIFO OK !\n");
  618. tmp1[MPU6050_AXIS_X] = (s16)((buf[MPU6050_AXIS_X*2+1]) | (buf[MPU6050_AXIS_X*2] << 8));
  619. tmp1[MPU6050_AXIS_Y] = (s16)((buf[MPU6050_AXIS_Y*2+1]) | (buf[MPU6050_AXIS_Y*2] << 8));
  620. tmp1[MPU6050_AXIS_Z] = (s16)((buf[MPU6050_AXIS_Z*2+1]) | (buf[MPU6050_AXIS_Z*2] << 8));
  621. /* remap coordinate// */
  622. tmp2[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*tmp1[MPU6050_AXIS_X];
  623. tmp2[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*tmp1[MPU6050_AXIS_Y];
  624. tmp2[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*tmp1[MPU6050_AXIS_Z];
  625. data[3 * i + MPU6050_AXIS_X] = tmp2[MPU6050_AXIS_X];
  626. data[3 * i + MPU6050_AXIS_Y] = tmp2[MPU6050_AXIS_Y];
  627. data[3 * i + MPU6050_AXIS_Z] = tmp2[MPU6050_AXIS_Z];
  628. GYRO_DBG("gyro FIFO packet[%d]:[%04X %04X %04X] => [%5d %5d %5d]\n", i,
  629. data[3*i + MPU6050_AXIS_X], data[3*i + MPU6050_AXIS_Y], data[3*i + MPU6050_AXIS_Z],
  630. data[3*i + MPU6050_AXIS_X], data[3*i + MPU6050_AXIS_Y], data[3*i + MPU6050_AXIS_Z]);
  631. }
  632. } else {
  633. GYRO_ERROR("MPU6050 Incorrect packet count: %d\n", packet_cnt);
  634. return -3;
  635. }
  636. return 0;
  637. }
  638. /*----------------------------------------------------------------------------*/
  639. static int MPU6050_ReadGyroData(struct i2c_client *client, char *buf, int bufsize)
  640. {
  641. char databuf[6];
  642. int data[3];
  643. struct mpu6050_i2c_data *obj = i2c_get_clientdata(client);
  644. if (sensor_power == false) {
  645. MPU6050_SetPowerMode(client, true);
  646. msleep(50);
  647. }
  648. #if INV_GYRO_AUTO_CALI == 1
  649. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  650. if (MPU6050_hwmsen_read_block(MPU6050_REG_TEMPH, databuf, 2)) {
  651. #else
  652. if (hwmsen_read_block(client, MPU6050_REG_TEMPH, databuf, 2)) {
  653. #endif
  654. GYRO_ERROR("MPU6050 read temperature data error\n");
  655. return -2;
  656. }
  657. mutex_lock(&obj->temperature_mutex);
  658. obj->temperature = ((s16)((databuf[1]) | (databuf[0] << 8)));
  659. mutex_unlock(&obj->temperature_mutex);
  660. #endif
  661. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  662. if (MPU6050_hwmsen_read_block(MPU6050_REG_GYRO_XH, databuf, 6)) {
  663. #else
  664. if (hwmsen_read_block(client, MPU6050_REG_GYRO_XH, databuf, 6)) {
  665. #endif
  666. GYRO_ERROR("MPU6050 read gyroscope data error\n");
  667. return -2;
  668. }
  669. obj->data[MPU6050_AXIS_X] = ((s16)((databuf[MPU6050_AXIS_X*2+1]) | (databuf[MPU6050_AXIS_X*2] << 8)));
  670. obj->data[MPU6050_AXIS_Y] = ((s16)((databuf[MPU6050_AXIS_Y*2+1]) | (databuf[MPU6050_AXIS_Y*2] << 8)));
  671. obj->data[MPU6050_AXIS_Z] = ((s16)((databuf[MPU6050_AXIS_Z*2+1]) | (databuf[MPU6050_AXIS_Z*2] << 8)));
  672. #if MPU6050GY_DEBUG
  673. if (atomic_read(&obj->trace) & GYRO_TRC_RAWDATA) {
  674. GYRO_DBG("read gyro register: %d, %d, %d, %d, %d, %d",
  675. databuf[0], databuf[1], databuf[2], databuf[3], databuf[4], databuf[5]);
  676. GYRO_DBG("get gyro raw data (0x%08X, 0x%08X, 0x%08X) -> (%5d, %5d, %5d)\n",
  677. obj->data[MPU6050_AXIS_X], obj->data[MPU6050_AXIS_Y], obj->data[MPU6050_AXIS_Z],
  678. obj->data[MPU6050_AXIS_X], obj->data[MPU6050_AXIS_Y], obj->data[MPU6050_AXIS_Z]);
  679. }
  680. #endif
  681. #if INV_GYRO_AUTO_CALI == 1
  682. mutex_lock(&obj->raw_data_mutex);
  683. /*remap coordinate*/
  684. obj->inv_cali_raw[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*obj->data[MPU6050_AXIS_X];
  685. obj->inv_cali_raw[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*obj->data[MPU6050_AXIS_Y];
  686. obj->inv_cali_raw[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*obj->data[MPU6050_AXIS_Z];
  687. mutex_unlock(&obj->raw_data_mutex);
  688. #endif
  689. obj->data[MPU6050_AXIS_X] = obj->data[MPU6050_AXIS_X] + obj->cali_sw[MPU6050_AXIS_X];
  690. obj->data[MPU6050_AXIS_Y] = obj->data[MPU6050_AXIS_Y] + obj->cali_sw[MPU6050_AXIS_Y];
  691. obj->data[MPU6050_AXIS_Z] = obj->data[MPU6050_AXIS_Z] + obj->cali_sw[MPU6050_AXIS_Z];
  692. /*remap coordinate*/
  693. data[obj->cvt.map[MPU6050_AXIS_X]] = obj->cvt.sign[MPU6050_AXIS_X]*obj->data[MPU6050_AXIS_X];
  694. data[obj->cvt.map[MPU6050_AXIS_Y]] = obj->cvt.sign[MPU6050_AXIS_Y]*obj->data[MPU6050_AXIS_Y];
  695. data[obj->cvt.map[MPU6050_AXIS_Z]] = obj->cvt.sign[MPU6050_AXIS_Z]*obj->data[MPU6050_AXIS_Z];
  696. /* Out put the degree/second(o/s) */
  697. data[MPU6050_AXIS_X] = data[MPU6050_AXIS_X] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB;
  698. data[MPU6050_AXIS_Y] = data[MPU6050_AXIS_Y] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB;
  699. data[MPU6050_AXIS_Z] = data[MPU6050_AXIS_Z] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB;
  700. sprintf(buf, "%04x %04x %04x", data[MPU6050_AXIS_X], data[MPU6050_AXIS_Y], data[MPU6050_AXIS_Z]);
  701. #if MPU6050GY_DEBUG
  702. if (atomic_read(&obj->trace) & GYRO_TRC_DATA)
  703. GYRO_DBG("get gyro data packet:[%d %d %d]\n", data[0], data[1], data[2]);
  704. #endif
  705. return 0;
  706. }
  707. /* for factory mode */
  708. static int MPU6050_PROCESS_SMT_DATA(struct i2c_client *client, short *data)
  709. {
  710. int total_num = 0;
  711. int retval = 0;
  712. long xSum = 0;
  713. long ySum = 0;
  714. long zSum = 0;
  715. long xAvg, yAvg, zAvg;
  716. long xRMS, yRMS, zRMS;
  717. int i = 0;
  718. int bias_thresh = 5242; /* 40 dps * 131.072 LSB/dps */
  719. /* float RMS_thresh = 687.19f; // (.2 dps * 131.072) ^ 2 */
  720. long RMS_thresh = 68719; /* (.2 dps * 131.072) ^ 2 */
  721. total_num = data[0];
  722. retval = data[1];
  723. GYRO_DBG("MPU6050 read gyro data OK, total number: %d\n", total_num);
  724. for (i = 0; i < total_num; i++) {
  725. xSum = xSum + data[MPU6050_AXES_NUM*i + MPU6050_AXIS_X + 2];
  726. ySum = ySum + data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Y + 2];
  727. zSum = zSum + data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Z + 2];
  728. /*
  729. FLPLOGD("read gyro data OK: packet_num:%d, [X:%5d, Y:%5d, Z:%5d]\n", i,
  730. data[MPU6050_AXES_NUM*i + MPU6050_AXIS_X +2], data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Y +2],
  731. data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Z +2]);
  732. FLPLOGD("MPU6050 xSum: %5d, ySum: %5d, zSum: %5d\n", xSum, ySum, zSum);
  733. */
  734. }
  735. GYRO_DBG("MPU6050 xSum: %5ld, ySum: %5ld, zSum: %5ld\n", xSum, ySum, zSum);
  736. if (total_num != 0) {
  737. xAvg = (xSum / total_num);
  738. yAvg = (ySum / total_num);
  739. zAvg = (zSum / total_num);
  740. } else {
  741. xAvg = xSum;
  742. yAvg = ySum;
  743. zAvg = zSum;
  744. }
  745. GYRO_DBG("MPU6050 xAvg: %ld, yAvg: %ld, zAvg: %ld\n", xAvg, yAvg, zAvg);
  746. if (abs(xAvg) > bias_thresh) {
  747. GYRO_ERROR("X-Gyro bias exceeded threshold\n");
  748. retval |= 1 << 3;
  749. }
  750. if (abs(yAvg) > bias_thresh) {
  751. GYRO_ERROR("Y-Gyro bias exceeded threshold\n");
  752. retval |= 1 << 4;
  753. }
  754. if (abs(zAvg) > bias_thresh) {
  755. GYRO_ERROR("Z-Gyro bias exceeded threshold\n");
  756. retval |= 1 << 5;
  757. }
  758. xRMS = 0;
  759. yRMS = 0;
  760. zRMS = 0;
  761. /* Finally, check RMS */
  762. for (i = 0; i < total_num; i++) {
  763. xRMS += (data[MPU6050_AXES_NUM*i + MPU6050_AXIS_X+2]-xAvg)*
  764. (data[MPU6050_AXES_NUM*i + MPU6050_AXIS_X+2]-xAvg);
  765. yRMS += (data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Y+2]-yAvg)*
  766. (data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Y+2]-yAvg);
  767. zRMS += (data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Z+2]-zAvg)*
  768. (data[MPU6050_AXES_NUM*i + MPU6050_AXIS_Z+2]-zAvg);
  769. }
  770. GYRO_DBG("MPU6050 xRMS: %ld, yRMS: %ld, zRMS: %ld\n", xRMS, yRMS, zRMS);
  771. xRMS = 100*xRMS;
  772. yRMS = 100*yRMS;
  773. zRMS = 100*zRMS;
  774. if (FACTORY_BOOT == get_boot_mode())
  775. return retval;
  776. if (xRMS > RMS_thresh * total_num) {
  777. GYRO_ERROR("X-Gyro RMS exceeded threshold, RMS_thresh: %ld\n", RMS_thresh * total_num);
  778. retval |= 1 << 6;
  779. }
  780. if (yRMS > RMS_thresh * total_num) {
  781. GYRO_ERROR("Y-Gyro RMS exceeded threshold, RMS_thresh: %ld\n", RMS_thresh * total_num);
  782. retval |= 1 << 7;
  783. }
  784. if (zRMS > RMS_thresh * total_num) {
  785. GYRO_ERROR("Z-Gyro RMS exceeded threshold, RMS_thresh: %ld\n", RMS_thresh * total_num);
  786. retval |= 1 << 8;
  787. }
  788. if (xRMS == 0 || yRMS == 0 || zRMS == 0)
  789. /* If any of the RMS noise value returns zero, then we might have dead gyro or FIFO/register failure */
  790. retval |= 1 << 9;
  791. GYRO_DBG("retval %d\n", retval);
  792. return retval;
  793. }
  794. /*----------------------------------------------------------------------------*/
  795. static int MPU6050_SMTReadSensorData(struct i2c_client *client, s16 *buf, int bufsize)
  796. {
  797. /* S16 gyro[MPU6050_AXES_NUM*MPU6050_FIFOSIZE]; */
  798. int res = 0;
  799. int i;
  800. int datalen, total_num = 0;
  801. GYRO_FUNC();
  802. if (sensor_power == false)
  803. MPU6050_SetPowerMode(client, true);
  804. if (NULL == buf)
  805. return -1;
  806. if (NULL == client) {
  807. *buf = 0;
  808. return -2;
  809. }
  810. for (i = 0; i < MPU6050_AXES_NUM; i++) {
  811. res = MPU6050_FIFOConfig(client, (i+1));
  812. if (res) {
  813. GYRO_ERROR("MPU6050_FIFOConfig error:%d!\n", res);
  814. return -3;
  815. }
  816. /* putting data in FIFO during the delayed 600ms */
  817. mdelay(600);
  818. res = MPU6050_ReadFifoData(client, &(buf[total_num+2]), &datalen);
  819. if (res) {
  820. if (res == (-3))
  821. buf[1] = (1 << i);
  822. else {
  823. GYRO_ERROR("MPU6050_ReadData error:%d!\n", res);
  824. return -3;
  825. }
  826. } else {
  827. buf[0] = datalen;
  828. total_num += datalen*MPU6050_AXES_NUM;
  829. }
  830. }
  831. GYRO_DBG("gyroscope read data OK, total packet: %d", buf[0]);
  832. return 0;
  833. }
  834. /*----------------------------------------------------------------------------*/
  835. static int MPU6050_ReadChipInfo(struct i2c_client *client, char *buf, int bufsize)
  836. {
  837. u8 databuf[10];
  838. memset(databuf, 0, sizeof(u8)*10);
  839. if ((NULL == buf) || (bufsize <= 30))
  840. return -1;
  841. if (NULL == client) {
  842. *buf = 0;
  843. return -2;
  844. }
  845. sprintf(buf, "MPU6050 Chip");
  846. return 0;
  847. }
  848. #if INV_GYRO_AUTO_CALI == 1
  849. /*----------------------------------------------------------------------------*/
  850. static int MPU6050_ReadGyroDataRaw(struct i2c_client *client, char *buf, int bufsize)
  851. {
  852. struct mpu6050_i2c_data *obj = i2c_get_clientdata(client);
  853. mutex_lock(&obj->raw_data_mutex);
  854. /* return gyro raw LSB in device orientation */
  855. sprintf(buf, "%x %x %x", obj->inv_cali_raw[MPU6050_AXIS_X],
  856. obj->inv_cali_raw[MPU6050_AXIS_Y], obj->inv_cali_raw[MPU6050_AXIS_Z]);
  857. #if MPU6050GY_DEBUG
  858. if (atomic_read(&obj->trace) & GYRO_TRC_DATA)
  859. GYRO_DBG("get gyro raw data packet:[%d %d %d]\n", obj->inv_cali_raw[0],
  860. obj->inv_cali_raw[1], obj->inv_cali_raw[2]);
  861. #endif
  862. mutex_unlock(&obj->raw_data_mutex);
  863. return 0;
  864. }
  865. /*----------------------------------------------------------------------------*/
  866. static int MPU6050_ReadTemperature(struct i2c_client *client, char *buf, int bufsize)
  867. {
  868. struct mpu6050_i2c_data *obj = i2c_get_clientdata(client);
  869. mutex_lock(&obj->temperature_mutex);
  870. sprintf(buf, "%x", obj->temperature);
  871. #if MPU6050GY_DEBUG
  872. if (atomic_read(&obj->trace) & GYRO_TRC_DATA)
  873. GYRO_DBG("get gyro temperature:[%d]\n", obj->temperature);
  874. #endif
  875. mutex_unlock(&obj->temperature_mutex);
  876. return 0;
  877. }
  878. /*----------------------------------------------------------------------------*/
  879. static int MPU6050_ReadPowerStatus(struct i2c_client *client, char *buf, int bufsize)
  880. {
  881. #if MPU6050GY_DEBUG
  882. GYRO_DBG("get gyro PowerStatus:[%d]\n", sensor_power);
  883. #endif
  884. sprintf(buf, "%x", sensor_power);
  885. return 0;
  886. }
  887. #endif
  888. /*----------------------------------------------------------------------------*/
  889. static ssize_t show_chipinfo_value(struct device_driver *ddri, char *buf)
  890. {
  891. struct i2c_client *client = mpu6050_i2c_client;
  892. char strbuf[MPU6050_BUFSIZE];
  893. if (NULL == client) {
  894. GYRO_ERROR("i2c client is null!!\n");
  895. return 0;
  896. }
  897. MPU6050_ReadChipInfo(client, strbuf, MPU6050_BUFSIZE);
  898. return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
  899. }
  900. /*----------------------------------------------------------------------------*/
  901. static ssize_t show_sensordata_value(struct device_driver *ddri, char *buf)
  902. {
  903. struct i2c_client *client = mpu6050_i2c_client;
  904. char strbuf[MPU6050_BUFSIZE];
  905. if (NULL == client) {
  906. GYRO_ERROR("i2c client is null!!\n");
  907. return 0;
  908. }
  909. MPU6050_ReadGyroData(client, strbuf, MPU6050_BUFSIZE);
  910. return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
  911. }
  912. /*----------------------------------------------------------------------------*/
  913. static ssize_t show_trace_value(struct device_driver *ddri, char *buf)
  914. {
  915. ssize_t res;
  916. struct mpu6050_i2c_data *obj = obj_i2c_data;
  917. if (obj == NULL) {
  918. GYRO_ERROR("i2c_data obj is null!!\n");
  919. return 0;
  920. }
  921. res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace));
  922. return res;
  923. }
  924. /*----------------------------------------------------------------------------*/
  925. static ssize_t store_trace_value(struct device_driver *ddri, const char *buf, size_t count)
  926. {
  927. struct mpu6050_i2c_data *obj = obj_i2c_data;
  928. int trace;
  929. if (obj == NULL) {
  930. GYRO_ERROR("i2c_data obj is null!!\n");
  931. return 0;
  932. }
  933. if (1 == sscanf(buf, "0x%x", &trace))
  934. atomic_set(&obj->trace, trace);
  935. else
  936. GYRO_ERROR("invalid content: '%s', length = %zu\n", buf, count);
  937. return count;
  938. }
  939. /*----------------------------------------------------------------------------*/
  940. static ssize_t show_status_value(struct device_driver *ddri, char *buf)
  941. {
  942. ssize_t len = 0;
  943. struct mpu6050_i2c_data *obj = obj_i2c_data;
  944. if (obj == NULL) {
  945. GYRO_ERROR("i2c_data obj is null!!\n");
  946. return 0;
  947. }
  948. if (obj->hw)
  949. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: %d %d (%d %d)\n",
  950. obj->hw->i2c_num, obj->hw->direction, obj->hw->power_id, obj->hw->power_vol);
  951. else
  952. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: NULL\n");
  953. return len;
  954. }
  955. /*----------------------------------------------------------------------------*/
  956. static DRIVER_ATTR(chipinfo, S_IRUGO, show_chipinfo_value, NULL);
  957. static DRIVER_ATTR(sensordata, S_IRUGO, show_sensordata_value, NULL);
  958. static DRIVER_ATTR(trace, S_IWUSR | S_IRUGO, show_trace_value, store_trace_value);
  959. static DRIVER_ATTR(status, S_IRUGO, show_status_value, NULL);
  960. /*----------------------------------------------------------------------------*/
  961. static struct driver_attribute *MPU6050_attr_list[] = {
  962. &driver_attr_chipinfo, /*chip information*/
  963. &driver_attr_sensordata, /*dump sensor data*/
  964. &driver_attr_trace, /*trace log*/
  965. &driver_attr_status,
  966. };
  967. /*----------------------------------------------------------------------------*/
  968. static int mpu6050_create_attr(struct device_driver *driver)
  969. {
  970. int idx, err = 0;
  971. int num = (int)(sizeof(MPU6050_attr_list) / sizeof(MPU6050_attr_list[0]));
  972. if (driver == NULL)
  973. return -EINVAL;
  974. for (idx = 0; idx < num; idx++) {
  975. err = driver_create_file(driver, MPU6050_attr_list[idx]);
  976. if (0 != err) {
  977. GYRO_ERROR("driver_create_file (%s) = %d\n",
  978. MPU6050_attr_list[idx]->attr.name, err);
  979. break;
  980. }
  981. }
  982. return err;
  983. }
  984. /*----------------------------------------------------------------------------*/
  985. static int mpu6050_delete_attr(struct device_driver *driver)
  986. {
  987. int idx, err = 0;
  988. int num = (int)(sizeof(MPU6050_attr_list) / sizeof(MPU6050_attr_list[0]));
  989. if (driver == NULL)
  990. return -EINVAL;
  991. for (idx = 0; idx < num; idx++)
  992. driver_remove_file(driver, MPU6050_attr_list[idx]);
  993. return err;
  994. }
  995. /*----------------------------------------------------------------------------*/
  996. static int mpu6050_gpio_config(void)
  997. {
  998. /* because we donot use EINT ,to support low power */
  999. /* config to GPIO input mode + PD */
  1000. /* set GPIO_MSE_EINT_PIN */
  1001. /*
  1002. mt_set_gpio_mode(GPIO_GYRO_EINT_PIN, GPIO_GYRO_EINT_PIN_M_GPIO);
  1003. mt_set_gpio_dir(GPIO_GYRO_EINT_PIN, GPIO_DIR_IN);
  1004. mt_set_gpio_pull_enable(GPIO_GYRO_EINT_PIN, GPIO_PULL_ENABLE);
  1005. mt_set_gpio_pull_select(GPIO_GYRO_EINT_PIN, GPIO_PULL_DOWN);
  1006. */
  1007. return 0;
  1008. }
  1009. static int mpu6050_init_client(struct i2c_client *client, bool enable)
  1010. {
  1011. struct mpu6050_i2c_data *obj = i2c_get_clientdata(client);
  1012. int res = 0;
  1013. GYRO_FUNC();
  1014. mpu6050_gpio_config();
  1015. res = MPU6050_SetPowerMode(client, true);
  1016. if (res != MPU6050_SUCCESS)
  1017. return res;
  1018. /* The range should at least be 17.45 rad/s (ie: ~1000 deg/s). */
  1019. res = MPU6050_SetDataFormat(client, (MPU6050_SYNC_GYROX << MPU6050_EXT_SYNC) |
  1020. MPU6050_RATE_1K_LPFB_188HZ);
  1021. res = MPU6050_SetFullScale(client, (MPU6050_DEFAULT_FS << MPU6050_FS_RANGE));
  1022. if (res != MPU6050_SUCCESS)
  1023. return res;
  1024. /* Set 125HZ sample rate */
  1025. res = MPU6050_SetSampleRate(client, 125);
  1026. if (res != MPU6050_SUCCESS)
  1027. return res;
  1028. res = MPU6050_SetPowerMode(client, enable);
  1029. if (res != MPU6050_SUCCESS)
  1030. return res;
  1031. GYRO_DBG("mpu6050_init_client OK!\n");
  1032. #ifdef CONFIG_MPU6050_LOWPASS
  1033. memset(&obj->fir, 0x00, sizeof(obj->fir));
  1034. #endif
  1035. return MPU6050_SUCCESS;
  1036. }
  1037. /*----------------------------------------------------------------------------*/
  1038. int mpu6050_operate(void *self, uint32_t command, void *buff_in, int size_in,
  1039. void *buff_out, int size_out, int *actualout)
  1040. {
  1041. int err = 0;
  1042. int value;
  1043. struct mpu6050_i2c_data *priv = (struct mpu6050_i2c_data *)self;
  1044. struct hwm_sensor_data *gyro_data;
  1045. char buff[MPU6050_BUFSIZE];
  1046. switch (command) {
  1047. case SENSOR_DELAY:
  1048. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1049. GYRO_ERROR("Set delay parameter error!\n");
  1050. err = -EINVAL;
  1051. } else {
  1052. }
  1053. break;
  1054. case SENSOR_ENABLE:
  1055. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  1056. GYRO_ERROR("Enable gyroscope parameter error!\n");
  1057. err = -EINVAL;
  1058. } else {
  1059. value = *(int *)buff_in;
  1060. if (((value == 0) && (sensor_power == false))
  1061. || ((value == 1) && (sensor_power == true))) {
  1062. GYRO_DBG("gyroscope device have updated!\n");
  1063. } else {
  1064. err = MPU6050_SetPowerMode(priv->client, !sensor_power);
  1065. }
  1066. #if INV_GYRO_AUTO_CALI == 1
  1067. inv_gyro_power_state = sensor_power;
  1068. /* put this in where gyro power is changed, waking up mpu daemon */
  1069. sysfs_notify(&inv_daemon_device->kobj, NULL, "inv_gyro_power_state");
  1070. #endif
  1071. }
  1072. break;
  1073. case SENSOR_GET_DATA:
  1074. if ((buff_out == NULL) || (size_out < sizeof(struct hwm_sensor_data))) {
  1075. GYRO_ERROR("get gyroscope data parameter error!\n");
  1076. err = -EINVAL;
  1077. } else {
  1078. gyro_data = (struct hwm_sensor_data *) buff_out;
  1079. err = MPU6050_ReadGyroData(priv->client, buff, MPU6050_BUFSIZE);
  1080. if (!err) {
  1081. err = sscanf(buff, "%x %x %x", &gyro_data->values[0],
  1082. &gyro_data->values[1], &gyro_data->values[2]);
  1083. gyro_data->status = SENSOR_STATUS_ACCURACY_MEDIUM;
  1084. gyro_data->value_divide = DEGREE_TO_RAD;
  1085. #if INV_GYRO_AUTO_CALI == 1
  1086. /* put this in where gyro data is ready to report to hal, waking up mpu daemon */
  1087. sysfs_notify(&inv_daemon_device->kobj, NULL, "inv_gyro_data_ready");
  1088. #endif
  1089. }
  1090. }
  1091. break;
  1092. default:
  1093. GYRO_ERROR("gyroscope operate function no this parameter %d!\n", command);
  1094. err = -1;
  1095. break;
  1096. }
  1097. return err;
  1098. }
  1099. /******************************************************************************
  1100. * Function Configuration
  1101. ******************************************************************************/
  1102. static int mpu6050_open(struct inode *inode, struct file *file)
  1103. {
  1104. file->private_data = mpu6050_i2c_client;
  1105. if (file->private_data == NULL) {
  1106. GYRO_ERROR("null pointer!!\n");
  1107. return -EINVAL;
  1108. }
  1109. return nonseekable_open(inode, file);
  1110. }
  1111. /*----------------------------------------------------------------------------*/
  1112. static int mpu6050_release(struct inode *inode, struct file *file)
  1113. {
  1114. file->private_data = NULL;
  1115. return 0;
  1116. }
  1117. /*----------------------------------------------------------------------------*/
  1118. static long mpu6050_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  1119. {
  1120. struct i2c_client *client = (struct i2c_client *)file->private_data;
  1121. char strbuf[MPU6050_BUFSIZE] = { 0 };
  1122. s16 *SMTdata;
  1123. void __user *data;
  1124. long err = 0;
  1125. int copy_cnt = 0;
  1126. struct SENSOR_DATA sensor_data;
  1127. int cali[3];
  1128. int smtRes = 0;
  1129. if (_IOC_DIR(cmd) & _IOC_READ)
  1130. err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
  1131. else if (_IOC_DIR(cmd) & _IOC_WRITE)
  1132. err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
  1133. if (err) {
  1134. GYRO_ERROR("access error: %08X, (%2d, %2d)\n", cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd));
  1135. return -EFAULT;
  1136. }
  1137. switch (cmd) {
  1138. case GYROSCOPE_IOCTL_INIT:
  1139. mpu6050_init_client(client, false);
  1140. break;
  1141. case GYROSCOPE_IOCTL_SMT_DATA:
  1142. data = (void __user *)arg;
  1143. if (data == NULL) {
  1144. err = -EINVAL;
  1145. break;
  1146. }
  1147. SMTdata = kzalloc(sizeof(*SMTdata) * 800, GFP_KERNEL);
  1148. if (SMTdata == NULL) {
  1149. err = -ENOMEM;
  1150. break;
  1151. }
  1152. memset(SMTdata, 0, sizeof(*SMTdata) * 800);
  1153. MPU6050_SMTReadSensorData(client, SMTdata, 800);
  1154. GYRO_DBG("gyroscope read data from kernel OK: SMTdata[0]:%d, copied packet:%zd!\n",
  1155. SMTdata[0], ((SMTdata[0] * MPU6050_AXES_NUM + 2) * sizeof(s16) + 1));
  1156. smtRes = MPU6050_PROCESS_SMT_DATA(client, SMTdata);
  1157. GYRO_DBG("ioctl smtRes: %d!\n", smtRes);
  1158. copy_cnt = copy_to_user(data, &smtRes, sizeof(smtRes));
  1159. kfree(SMTdata);
  1160. if (copy_cnt) {
  1161. err = -EFAULT;
  1162. GYRO_ERROR("copy gyro data to user failed!\n");
  1163. }
  1164. GYRO_DBG("copy gyro data to user OK: %d!\n", copy_cnt);
  1165. break;
  1166. case GYROSCOPE_IOCTL_READ_SENSORDATA:
  1167. data = (void __user *)arg;
  1168. if (data == NULL) {
  1169. err = -EINVAL;
  1170. break;
  1171. }
  1172. MPU6050_ReadGyroData(client, strbuf, MPU6050_BUFSIZE);
  1173. if (copy_to_user(data, strbuf, sizeof(strbuf))) {
  1174. err = -EFAULT;
  1175. break;
  1176. }
  1177. break;
  1178. case GYROSCOPE_IOCTL_SET_CALI:
  1179. data = (void __user *)arg;
  1180. if (data == NULL) {
  1181. err = -EINVAL;
  1182. break;
  1183. }
  1184. if (copy_from_user(&sensor_data, data, sizeof(sensor_data))) {
  1185. err = -EFAULT;
  1186. break;
  1187. }
  1188. else {
  1189. cali[MPU6050_AXIS_X] = sensor_data.x * MPU6050_DEFAULT_LSB / MPU6050_FS_MAX_LSB;
  1190. cali[MPU6050_AXIS_Y] = sensor_data.y * MPU6050_DEFAULT_LSB / MPU6050_FS_MAX_LSB;
  1191. cali[MPU6050_AXIS_Z] = sensor_data.z * MPU6050_DEFAULT_LSB / MPU6050_FS_MAX_LSB;
  1192. GYRO_DBG("gyro set cali:[%5d %5d %5d]\n",
  1193. cali[MPU6050_AXIS_X], cali[MPU6050_AXIS_Y], cali[MPU6050_AXIS_Z]);
  1194. err = MPU6050_WriteCalibration(client, cali);
  1195. }
  1196. break;
  1197. case GYROSCOPE_IOCTL_CLR_CALI:
  1198. err = MPU6050_ResetCalibration(client);
  1199. break;
  1200. case GYROSCOPE_IOCTL_GET_CALI:
  1201. data = (void __user *)arg;
  1202. if (data == NULL) {
  1203. err = -EINVAL;
  1204. break;
  1205. }
  1206. err = MPU6050_ReadCalibration(client, cali);
  1207. if (err)
  1208. break;
  1209. sensor_data.x = cali[MPU6050_AXIS_X] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB;
  1210. sensor_data.y = cali[MPU6050_AXIS_Y] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB;
  1211. sensor_data.z = cali[MPU6050_AXIS_Z] * MPU6050_FS_MAX_LSB / MPU6050_DEFAULT_LSB;
  1212. if (copy_to_user(data, &sensor_data, sizeof(sensor_data))) {
  1213. err = -EFAULT;
  1214. break;
  1215. }
  1216. break;
  1217. #if INV_GYRO_AUTO_CALI == 1
  1218. case GYROSCOPE_IOCTL_READ_SENSORDATA_RAW:
  1219. data = (void __user *)arg;
  1220. if (data == NULL) {
  1221. err = -EINVAL;
  1222. break;
  1223. }
  1224. MPU6050_ReadGyroDataRaw(client, strbuf, MPU6050_BUFSIZE);
  1225. if (copy_to_user(data, strbuf, sizeof(strbuf))) {
  1226. err = -EFAULT;
  1227. break;
  1228. }
  1229. break;
  1230. case GYROSCOPE_IOCTL_READ_TEMPERATURE:
  1231. data = (void __user *)arg;
  1232. if (data == NULL) {
  1233. err = -EINVAL;
  1234. break;
  1235. }
  1236. MPU6050_ReadTemperature(client, strbuf, MPU6050_BUFSIZE);
  1237. if (copy_to_user(data, strbuf, sizeof(strbuf))) {
  1238. err = -EFAULT;
  1239. break;
  1240. }
  1241. break;
  1242. case GYROSCOPE_IOCTL_GET_POWER_STATUS:
  1243. data = (void __user *)arg;
  1244. if (data == NULL) {
  1245. err = -EINVAL;
  1246. break;
  1247. }
  1248. MPU6050_ReadPowerStatus(client, strbuf, MPU6050_BUFSIZE);
  1249. if (copy_to_user(data, strbuf, sizeof(strbuf))) {
  1250. err = -EFAULT;
  1251. break;
  1252. }
  1253. break;
  1254. #endif
  1255. default:
  1256. GYRO_ERROR("unknown IOCTL: 0x%08x\n", cmd);
  1257. err = -ENOIOCTLCMD;
  1258. break;
  1259. }
  1260. return err;
  1261. }
  1262. #ifdef CONFIG_COMPAT
  1263. static long mpu6050_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  1264. {
  1265. long ret;
  1266. void __user *arg32 = compat_ptr(arg);
  1267. if (!file->f_op || !file->f_op->unlocked_ioctl)
  1268. return -ENOTTY;
  1269. /* printk("akm8963_compat_ioctl arg: 0x%lx, arg32: 0x%p\n",arg, arg32); */
  1270. switch (cmd) {
  1271. case COMPAT_GYROSCOPE_IOCTL_INIT:
  1272. /* printk("akm8963_compat_ioctl COMPAT_ECS_IOCTL_WRITE\n"); */
  1273. if (arg32 == NULL) {
  1274. GYRO_ERROR("invalid argument.");
  1275. return -EINVAL;
  1276. }
  1277. ret = file->f_op->unlocked_ioctl(file, GYROSCOPE_IOCTL_INIT,
  1278. (unsigned long)arg32);
  1279. if (ret) {
  1280. GYRO_ERROR("GYROSCOPE_IOCTL_INIT unlocked_ioctl failed.");
  1281. return ret;
  1282. }
  1283. break;
  1284. case COMPAT_GYROSCOPE_IOCTL_SET_CALI:
  1285. if (arg32 == NULL) {
  1286. GYRO_ERROR("invalid argument.");
  1287. return -EINVAL;
  1288. }
  1289. ret = file->f_op->unlocked_ioctl(file, GYROSCOPE_IOCTL_SET_CALI,
  1290. (unsigned long)arg32);
  1291. if (ret) {
  1292. GYRO_ERROR("GYROSCOPE_IOCTL_SET_CALI unlocked_ioctl failed.");
  1293. return ret;
  1294. }
  1295. break;
  1296. case COMPAT_GYROSCOPE_IOCTL_CLR_CALI:
  1297. if (arg32 == NULL) {
  1298. GYRO_ERROR("invalid argument.");
  1299. return -EINVAL;
  1300. }
  1301. ret = file->f_op->unlocked_ioctl(file, GYROSCOPE_IOCTL_CLR_CALI,
  1302. (unsigned long)arg32);
  1303. if (ret) {
  1304. GYRO_ERROR("GYROSCOPE_IOCTL_CLR_CALI unlocked_ioctl failed.");
  1305. return ret;
  1306. }
  1307. break;
  1308. case COMPAT_GYROSCOPE_IOCTL_GET_CALI:
  1309. if (arg32 == NULL) {
  1310. GYRO_ERROR("invalid argument.");
  1311. return -EINVAL;
  1312. }
  1313. ret = file->f_op->unlocked_ioctl(file, GYROSCOPE_IOCTL_GET_CALI,
  1314. (unsigned long)arg32);
  1315. if (ret) {
  1316. GYRO_ERROR("GYROSCOPE_IOCTL_GET_CALI unlocked_ioctl failed.");
  1317. return ret;
  1318. }
  1319. break;
  1320. case COMPAT_GYROSCOPE_IOCTL_READ_SENSORDATA:
  1321. if (arg32 == NULL) {
  1322. GYRO_ERROR("invalid argument.");
  1323. return -EINVAL;
  1324. }
  1325. ret = file->f_op->unlocked_ioctl(file, GYROSCOPE_IOCTL_READ_SENSORDATA,
  1326. (unsigned long)arg32);
  1327. if (ret) {
  1328. GYRO_ERROR("GYROSCOPE_IOCTL_READ_SENSORDATA unlocked_ioctl failed.");
  1329. return ret;
  1330. }
  1331. break;
  1332. default:
  1333. pr_debug("%s not supported = 0x%04x", __func__, cmd);
  1334. ret = -ENOIOCTLCMD;
  1335. break;
  1336. }
  1337. return ret;
  1338. }
  1339. #endif
  1340. /*----------------------------------------------------------------------------*/
  1341. static const struct file_operations mpu6050_fops = {
  1342. .open = mpu6050_open,
  1343. .release = mpu6050_release,
  1344. .unlocked_ioctl = mpu6050_unlocked_ioctl,
  1345. #ifdef CONFIG_COMPAT
  1346. .compat_ioctl = mpu6050_compat_ioctl,
  1347. #endif
  1348. };
  1349. /*----------------------------------------------------------------------------*/
  1350. static struct miscdevice mpu6050_device = {
  1351. .minor = MISC_DYNAMIC_MINOR,
  1352. .name = "gyroscope",
  1353. .fops = &mpu6050_fops,
  1354. };
  1355. /*----------------------------------------------------------------------------*/
  1356. #ifndef CONFIG_HAS_EARLYSUSPEND
  1357. /*----------------------------------------------------------------------------*/
  1358. static int mpu6050_suspend(struct i2c_client *client, pm_message_t msg)
  1359. {
  1360. struct mpu6050_i2c_data *obj = i2c_get_clientdata(client);
  1361. int err = 0;
  1362. GYRO_FUNC();
  1363. if (msg.event == PM_EVENT_SUSPEND) {
  1364. if (obj == NULL) {
  1365. GYRO_ERROR("null pointer!!\n");
  1366. return -EINVAL;
  1367. }
  1368. atomic_set(&obj->suspend, 1);
  1369. err = MPU6050_SetPowerMode(client, false);
  1370. if (err <= 0)
  1371. return err;
  1372. #if INV_GYRO_AUTO_CALI == 1
  1373. inv_gyro_power_state = sensor_power;
  1374. /* inv_gyro_power_state = 0; */
  1375. /* put this in where gyro power is changed, waking up mpu daemon */
  1376. sysfs_notify(&inv_daemon_device->kobj, NULL, "inv_gyro_power_state");
  1377. #endif
  1378. }
  1379. return err;
  1380. }
  1381. /*----------------------------------------------------------------------------*/
  1382. static int mpu6050_resume(struct i2c_client *client)
  1383. {
  1384. struct mpu6050_i2c_data *obj = i2c_get_clientdata(client);
  1385. int err;
  1386. GYRO_FUNC();
  1387. if (obj == NULL) {
  1388. GYRO_ERROR("null pointer!!\n");
  1389. return -EINVAL;
  1390. }
  1391. MPU6050_power(obj->hw, 1);
  1392. err = mpu6050_init_client(client, false);
  1393. if (err) {
  1394. GYRO_ERROR("initialize client fail!!\n");
  1395. return err;
  1396. }
  1397. atomic_set(&obj->suspend, 0);
  1398. return 0;
  1399. }
  1400. /*----------------------------------------------------------------------------*/
  1401. #else /*CONFIG_HAS_EARLY_SUSPEND is defined */
  1402. /*----------------------------------------------------------------------------*/
  1403. static void mpu6050_early_suspend(struct early_suspend *h)
  1404. {
  1405. struct mpu6050_i2c_data *obj = container_of(h, struct mpu6050_i2c_data, early_drv);
  1406. int err;
  1407. /* u8 databuf[2]; */
  1408. GYRO_FUNC();
  1409. if (obj == NULL) {
  1410. GYRO_ERROR("null pointer!!\n");
  1411. return;
  1412. }
  1413. atomic_set(&obj->suspend, 1);
  1414. err = MPU6050_SetPowerMode(obj->client, false);
  1415. if (err) {
  1416. GYRO_ERROR("write power control fail!!\n");
  1417. return;
  1418. }
  1419. sensor_power = false;
  1420. MPU6050_power(obj->hw, 0);
  1421. #if INV_GYRO_AUTO_CALI == 1
  1422. inv_gyro_power_state = sensor_power;
  1423. /* inv_gyro_power_state = 0; */
  1424. /* put this in where gyro power is changed, waking up mpu daemon */
  1425. sysfs_notify(&inv_daemon_device->kobj, NULL, "inv_gyro_power_state");
  1426. #endif
  1427. }
  1428. /*----------------------------------------------------------------------------*/
  1429. static void mpu6050_late_resume(struct early_suspend *h)
  1430. {
  1431. struct mpu6050_i2c_data *obj = container_of(h, struct mpu6050_i2c_data, early_drv);
  1432. int err;
  1433. GYRO_FUNC();
  1434. if (obj == NULL) {
  1435. GYRO_ERROR("null pointer!!\n");
  1436. return;
  1437. }
  1438. MPU6050_power(obj->hw, 1);
  1439. err = mpu6050_init_client(obj->client, false);
  1440. if (err) {
  1441. GYRO_ERROR("initialize client fail! err code %d!\n", err);
  1442. return;
  1443. }
  1444. atomic_set(&obj->suspend, 0);
  1445. }
  1446. /*----------------------------------------------------------------------------*/
  1447. #endif /*CONFIG_HAS_EARLYSUSPEND */
  1448. /*----------------------------------------------------------------------------*/
  1449. static int mpu6050_i2c_detect(struct i2c_client *client, struct i2c_board_info *info)
  1450. {
  1451. strcpy(info->type, MPU6050_DEV_NAME);
  1452. return 0;
  1453. }
  1454. /* if use this typ of enable , Gsensor should report inputEvent(x, y, z ,stats, div) to HAL */
  1455. static int mpu6050_open_report_data(int open)
  1456. {
  1457. /* should queuq work to report event if is_report_input_direct=true */
  1458. return 0;
  1459. }
  1460. /* if use this typ of enable , Gsensor only enabled but not report inputEvent to HAL */
  1461. static int mpu6050_enable_nodata(int en)
  1462. {
  1463. int res = 0;
  1464. int retry = 0;
  1465. bool power = false;
  1466. if (1 == en)
  1467. power = true;
  1468. if (0 == en)
  1469. power = false;
  1470. for (retry = 0; retry < 3; retry++) {
  1471. res = MPU6050_SetPowerMode(obj_i2c_data->client, power);
  1472. if (res == 0)
  1473. break;
  1474. }
  1475. if (res != MPU6050_SUCCESS) {
  1476. GYRO_ERROR("MPU6050_SetPowerMode fail!\n");
  1477. return -1;
  1478. }
  1479. GYRO_INFO("mpu6050_enable_nodata OK!\n");
  1480. return 0;
  1481. }
  1482. static int mpu6050_set_delay(u64 ns)
  1483. {
  1484. return 0;
  1485. }
  1486. static int mpu6050_get_data(int *x , int *y, int *z, int *status)
  1487. {
  1488. char buff[MPU6050_BUFSIZE];
  1489. int ret;
  1490. MPU6050_ReadGyroData(obj_i2c_data->client, buff, MPU6050_BUFSIZE);
  1491. ret = sscanf(buff, "%x %x %x", x, y, z);
  1492. *status = SENSOR_STATUS_ACCURACY_MEDIUM;
  1493. return 0;
  1494. }
  1495. /*----------------------------------------------------------------------------*/
  1496. static int mpu6050_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
  1497. {
  1498. struct i2c_client *new_client;
  1499. struct mpu6050_i2c_data *obj;
  1500. int err = 0;
  1501. struct gyro_control_path ctl = {0};
  1502. struct gyro_data_path data = {0};
  1503. GYRO_FUNC();
  1504. obj = kzalloc(sizeof(*obj), GFP_KERNEL);
  1505. if (!(obj)) {
  1506. err = -ENOMEM;
  1507. goto exit;
  1508. }
  1509. memset(obj, 0, sizeof(struct mpu6050_i2c_data));
  1510. obj->hw = hw;
  1511. err = hwmsen_get_convert(obj->hw->direction, &obj->cvt);
  1512. if (err) {
  1513. GYRO_ERROR("invalid direction: %d\n", obj->hw->direction);
  1514. goto exit;
  1515. }
  1516. /*GYRO_DBG("gyro_default_i2c_addr: %x\n", client->addr);*/
  1517. #ifdef MPU6050_ACCESS_BY_GSE_I2C
  1518. obj->hw->addr = MPU6050_I2C_SLAVE_ADDR; /* mtk i2c not allow to probe two same address */
  1519. #endif
  1520. GYRO_DBG("gyro_custom_i2c_addr: %x\n", obj->hw->addr);
  1521. if (0 != obj->hw->addr) {
  1522. client->addr = obj->hw->addr >> 1;
  1523. GYRO_INFO("gyro_use_i2c_addr: %x\n", client->addr);
  1524. }
  1525. obj_i2c_data = obj;
  1526. obj->client = client;
  1527. new_client = obj->client;
  1528. i2c_set_clientdata(new_client, obj);
  1529. atomic_set(&obj->trace, 0);
  1530. atomic_set(&obj->suspend, 0);
  1531. mpu6050_i2c_client = new_client;
  1532. err = mpu6050_init_client(new_client, false);
  1533. if (err)
  1534. goto exit_init_failed;
  1535. err = misc_register(&mpu6050_device);
  1536. if (err) {
  1537. GYRO_ERROR("mpu6050_device misc register failed!\n");
  1538. goto exit_misc_device_register_failed;
  1539. }
  1540. ctl.is_use_common_factory = false;
  1541. err = mpu6050_create_attr(&(mpu6050_init_info.platform_diver_addr->driver));
  1542. if (err) {
  1543. GYRO_ERROR("mpu6050 create attribute err = %d\n", err);
  1544. goto exit_create_attr_failed;
  1545. }
  1546. ctl.open_report_data = mpu6050_open_report_data;
  1547. ctl.enable_nodata = mpu6050_enable_nodata;
  1548. ctl.set_delay = mpu6050_set_delay;
  1549. ctl.is_report_input_direct = false;
  1550. ctl.is_support_batch = obj->hw->is_batch_supported;
  1551. err = gyro_register_control_path(&ctl);
  1552. if (err) {
  1553. GYRO_ERROR("register gyro control path err\n");
  1554. goto exit_kfree;
  1555. }
  1556. data.get_data = mpu6050_get_data;
  1557. data.vender_div = DEGREE_TO_RAD;
  1558. err = gyro_register_data_path(&data);
  1559. if (err) {
  1560. GYRO_ERROR("gyro_register_data_path fail = %d\n", err);
  1561. goto exit_kfree;
  1562. }
  1563. #ifdef CONFIG_HAS_EARLYSUSPEND
  1564. obj->early_drv.level = EARLY_SUSPEND_LEVEL_STOP_DRAWING - 2,
  1565. obj->early_drv.suspend = mpu6050_early_suspend,
  1566. obj->early_drv.resume = mpu6050_late_resume, register_early_suspend(&obj->early_drv);
  1567. #endif
  1568. #if INV_GYRO_AUTO_CALI == 1
  1569. mutex_init(&obj->temperature_mutex);
  1570. mutex_init(&obj->raw_data_mutex);
  1571. {
  1572. int i;
  1573. int result;
  1574. /* create a class to avoid event drop by uevent_ops->filter function (dev_uevent_filter()) */
  1575. inv_daemon_class = class_create(THIS_MODULE, INV_DAEMON_CLASS_NAME);
  1576. if (IS_ERR(inv_daemon_class)) {
  1577. GYRO_ERROR("cannot create inv daemon class, %s\n", INV_DAEMON_CLASS_NAME);
  1578. goto exit_class_create_failed;
  1579. }
  1580. #if 0
  1581. inv_daemon_device = device_create(inv_daemon_class, NULL,
  1582. MKDEV(MISC_MAJOR, MISC_DYNAMIC_MINOR), NULL,
  1583. INV_DAEMON_DEVICE_NAME);
  1584. if (IS_ERR(inv_daemon_device)) {
  1585. GYRO_ERROR("cannot create inv daemon device, %s\n", INV_DAEMON_DEVICE_NAME);
  1586. goto exit_inv_device_create_failed;
  1587. }
  1588. #endif
  1589. inv_daemon_device = kzalloc(sizeof(struct device), GFP_KERNEL);
  1590. if (!inv_daemon_device) {
  1591. GYRO_ERROR("cannot allocate inv daemon device, %s\n", INV_DAEMON_DEVICE_NAME);
  1592. goto exit_device_register_failed;
  1593. }
  1594. inv_daemon_device->init_name = INV_DAEMON_DEVICE_NAME;
  1595. inv_daemon_device->class = inv_daemon_class;
  1596. inv_daemon_device->release = (void (*)(struct device *))kfree;
  1597. result = device_register(inv_daemon_device);
  1598. if (result) {
  1599. GYRO_ERROR("cannot register inv daemon device, %s\n", INV_DAEMON_DEVICE_NAME);
  1600. goto exit_device_register_failed;
  1601. }
  1602. result = 0;
  1603. for (i = 0; i < ARRAY_SIZE(inv_daemon_dev_attributes); i++) {
  1604. result =
  1605. device_create_file(inv_daemon_device, inv_daemon_dev_attributes[i]);
  1606. if (result)
  1607. break;
  1608. }
  1609. if (result) {
  1610. while (--i >= 0)
  1611. device_remove_file(inv_daemon_device, inv_daemon_dev_attributes[i]);
  1612. GYRO_ERROR("cannot create inv daemon dev attr.\n");
  1613. goto exit_create_file_failed;
  1614. }
  1615. }
  1616. #endif
  1617. mpu6050_init_flag = 0;
  1618. GYRO_DBG("%s: OK\n", __func__);
  1619. return 0;
  1620. #if INV_GYRO_AUTO_CALI == 1
  1621. exit_create_file_failed:
  1622. device_unregister(inv_daemon_device);
  1623. exit_device_register_failed:
  1624. class_destroy(inv_daemon_class);
  1625. exit_class_create_failed:
  1626. hwmsen_detach(ID_GYROSCOPE);
  1627. #endif
  1628. exit_create_attr_failed:
  1629. misc_deregister(&mpu6050_device);
  1630. exit_misc_device_register_failed:
  1631. exit_init_failed:
  1632. /* i2c_detach_client(new_client); */
  1633. exit_kfree:
  1634. kfree(obj);
  1635. exit:
  1636. mpu6050_init_flag = -1;
  1637. GYRO_ERROR("%s: err = %d\n", __func__, err);
  1638. return err;
  1639. }
  1640. /*----------------------------------------------------------------------------*/
  1641. static int mpu6050_i2c_remove(struct i2c_client *client)
  1642. {
  1643. int err = 0;
  1644. #if INV_GYRO_AUTO_CALI == 1
  1645. {
  1646. int i;
  1647. for (i = 0; i < ARRAY_SIZE(inv_daemon_dev_attributes); i++)
  1648. device_remove_file(inv_daemon_device, inv_daemon_dev_attributes[i]);
  1649. device_unregister(inv_daemon_device);
  1650. class_destroy(inv_daemon_class);
  1651. }
  1652. #endif
  1653. err = mpu6050_delete_attr(&(mpu6050_init_info.platform_diver_addr->driver));
  1654. if (err)
  1655. GYRO_ERROR("mpu6050_delete_attr fail: %d\n", err);
  1656. err = misc_deregister(&mpu6050_device);
  1657. if (err)
  1658. GYRO_ERROR("misc_deregister fail: %d\n", err);
  1659. err = hwmsen_detach(ID_GYROSCOPE);
  1660. if (err)
  1661. GYRO_ERROR("hwmsen_detach fail: %d\n", err);
  1662. mpu6050_i2c_client = NULL;
  1663. i2c_unregister_device(client);
  1664. kfree(i2c_get_clientdata(client));
  1665. return 0;
  1666. }
  1667. /*----------------------------------------------------------------------------*/
  1668. /*----------------------------------------------------------------------------*/
  1669. static int mpu6050_remove(void)
  1670. {
  1671. GYRO_FUNC();
  1672. MPU6050_power(hw, 0);
  1673. i2c_del_driver(&mpu6050gy_i2c_driver);
  1674. return 0;
  1675. }
  1676. /*----------------------------------------------------------------------------*/
  1677. static int mpu6050_local_init(struct platform_device *pdev)
  1678. {
  1679. MPU6050_power(hw, 1);
  1680. if (i2c_add_driver(&mpu6050gy_i2c_driver)) {
  1681. GYRO_ERROR("add driver error\n");
  1682. return -1;
  1683. }
  1684. if (-1 == mpu6050_init_flag)
  1685. return -1;
  1686. return 0;
  1687. }
  1688. /*----------------------------------------------------------------------------*/
  1689. static int __init mpu6050_init(void)
  1690. {
  1691. const char *name = "mediatek,mpu6050gy";
  1692. hw = get_gyro_dts_func(name, hw);
  1693. if (!hw)
  1694. GYRO_ERROR("get dts info fail\n");
  1695. gyro_driver_add(&mpu6050_init_info);
  1696. return 0;
  1697. }
  1698. /*----------------------------------------------------------------------------*/
  1699. static void __exit mpu6050_exit(void)
  1700. {
  1701. GYRO_FUNC();
  1702. }
  1703. /*----------------------------------------------------------------------------*/
  1704. module_init(mpu6050_init);
  1705. module_exit(mpu6050_exit);
  1706. /*----------------------------------------------------------------------------*/
  1707. MODULE_LICENSE("GPL");
  1708. MODULE_DESCRIPTION("MPU6050 gyroscope driver");
  1709. MODULE_AUTHOR("Yucong.Xiong@mediatek.com");