ITG1010.c 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631
  1. /*
  2. * Copyright(C)2014 MediaTek Inc.
  3. * Modification based on code covered by the below mentioned copyright
  4. * and/or permission notice(S).
  5. */
  6. /* ITG1010 motion sensor driver
  7. *
  8. * This software is licensed under the terms of the GNU General Public
  9. * License version 2, as published by the Free Software Foundation, and
  10. * may be copied, distributed, and modified under those terms.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. */
  18. #include "cust_gyro.h"
  19. #include "ITG1010.h"
  20. #include "gyroscope.h"
  21. #define DEBUG 0
  22. /*----------------------------------------------------------------------------*/
  23. #define INV_GYRO_AUTO_CALI 1
  24. #define ITG1010_DEFAULT_FS ITG1010_FS_1000
  25. #define ITG1010_DEFAULT_LSB ITG1010_FS_1000_LSB
  26. #define CONFIG_ITG1010_LOWPASS /*apply low pass filter on output*/
  27. #define ITG1010_AXIS_X 0
  28. #define ITG1010_AXIS_Y 1
  29. #define ITG1010_AXIS_Z 2
  30. #define ITG1010_AXES_NUM 3
  31. #define ITG1010_DATA_LEN 6
  32. #define ITG1010_DEV_NAME "ITG-1010A"
  33. int packet_thresh = 75; /* 600 ms / 8ms/sample */
  34. /*----------------------------------------------------------------------------*/
  35. static int ITG1010_init_flag = -1;
  36. /* Maintain cust info here */
  37. struct gyro_hw gyro_cust;
  38. static struct gyro_hw *hw = &gyro_cust;
  39. struct platform_device *gyroPltFmDev;
  40. /* For driver get cust info */
  41. struct gyro_hw *get_cust_gyro(void)
  42. {
  43. return &gyro_cust;
  44. }
  45. static const struct i2c_device_id ITG1010_i2c_id[] = {{ITG1010_DEV_NAME, 0}, {} };
  46. /* static struct i2c_board_info __initdata i2c_ITG1010={ I2C_BOARD_INFO(ITG1010_DEV_NAME,
  47. *(ITG1010_I2C_SLAVE_ADDR>>1))}; */
  48. static int ITG1010_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
  49. static int ITG1010_i2c_remove(struct i2c_client *client);
  50. static int ITG1010_i2c_detect(struct i2c_client *client, struct i2c_board_info *info);
  51. static int ITG1010_suspend(struct i2c_client *client, pm_message_t msg);
  52. static int ITG1010_resume(struct i2c_client *client);
  53. static int ITG1010_local_init(struct platform_device *pdev);
  54. static int ITG1010_remove(void);
  55. static struct gyro_init_info ITG1010_init_info = {
  56. .name = "ITG1010GY",
  57. .init = ITG1010_local_init,
  58. .uninit = ITG1010_remove,
  59. };
  60. /*----------------------------------------------------------------------------*/
  61. enum GYRO_TRC {
  62. GYRO_TRC_FILTER = 0x01,
  63. GYRO_TRC_RAWDATA = 0x02,
  64. GYRO_TRC_IOCTL = 0x04,
  65. GYRO_TRC_CALI = 0X08,
  66. GYRO_TRC_INFO = 0X10,
  67. GYRO_TRC_DATA = 0X20,
  68. };
  69. /*----------------------------------------------------------------------------*/
  70. struct scale_factor {
  71. u8 whole;
  72. u8 fraction;
  73. };
  74. /*----------------------------------------------------------------------------*/
  75. struct data_resolution {
  76. struct scale_factor scalefactor;
  77. int sensitivity;
  78. };
  79. /*----------------------------------------------------------------------------*/
  80. #define C_MAX_FIR_LENGTH (32)
  81. /*----------------------------------------------------------------------------*/
  82. struct data_filter {
  83. s16 raw[C_MAX_FIR_LENGTH][ITG1010_AXES_NUM];
  84. int sum[ITG1010_AXES_NUM];
  85. int num;
  86. int idx;
  87. };
  88. /*----------------------------------------------------------------------------*/
  89. struct ITG1010_i2c_data {
  90. struct i2c_client *client;
  91. struct gyro_hw *hw;
  92. struct hwmsen_convert cvt;
  93. /*misc*/
  94. struct data_resolution *reso;
  95. atomic_t trace;
  96. atomic_t suspend;
  97. atomic_t selftest;
  98. atomic_t filter;
  99. s16 cali_sw[ITG1010_AXES_NUM+1];
  100. /*data*/
  101. s8 offset[ITG1010_AXES_NUM+1]; /*+1: for 4-byte alignment*/
  102. s16 data[ITG1010_AXES_NUM+1];
  103. #if defined(CONFIG_ITG1010_LOWPASS)
  104. atomic_t firlen;
  105. atomic_t fir_en;
  106. struct data_filter fir;
  107. #endif
  108. #if INV_GYRO_AUTO_CALI == 1
  109. s16 inv_cali_raw[ITG1010_AXES_NUM+1];
  110. s16 temperature;
  111. struct mutex temperature_mutex;/* for temperature protection */
  112. struct mutex raw_data_mutex;/* for inv_cali_raw[] protection */
  113. #endif
  114. };
  115. /*----------------------------------------------------------------------------*/
  116. #ifdef CONFIG_OF
  117. static const struct of_device_id gyro_of_match[] = {
  118. {.compatible = "mediatek,gyro"},
  119. {},
  120. };
  121. #endif
  122. static struct i2c_driver ITG1010_i2c_driver = {
  123. .driver = {
  124. .name = ITG1010_DEV_NAME,
  125. #ifdef CONFIG_OF
  126. .of_match_table = gyro_of_match,
  127. #endif
  128. },
  129. .probe = ITG1010_i2c_probe,
  130. .remove = ITG1010_i2c_remove,
  131. .detect = ITG1010_i2c_detect,
  132. .suspend = ITG1010_suspend,
  133. .resume = ITG1010_resume,
  134. .id_table = ITG1010_i2c_id,
  135. };
  136. /*----------------------------------------------------------------------------*/
  137. static struct i2c_client *ITG1010_i2c_client;
  138. static struct ITG1010_i2c_data *obj_i2c_data;
  139. static bool sensor_power;
  140. static DEFINE_MUTEX(ITG1010_i2c_mutex);
  141. #define C_I2C_FIFO_SIZE 8
  142. /**************I2C operate API*****************************/
  143. static int ITG1010_i2c_read_block(struct i2c_client *client, u8 addr, u8 *data, u8 len)
  144. {
  145. u8 beg = addr;
  146. int err;
  147. struct i2c_msg msgs[2] = {{0}, {0} };
  148. mutex_lock(&ITG1010_i2c_mutex);
  149. msgs[0].addr = client->addr;
  150. msgs[0].flags = 0;
  151. msgs[0].len = 1;
  152. msgs[0].buf = &beg;
  153. msgs[1].addr = client->addr;
  154. msgs[1].flags = I2C_M_RD;
  155. msgs[1].len = len;
  156. msgs[1].buf = data;
  157. if (!client) {
  158. mutex_unlock(&ITG1010_i2c_mutex);
  159. return -EINVAL;
  160. } else if (len > C_I2C_FIFO_SIZE) {
  161. GYRO_ERR(" length %d exceeds %d\n", len, C_I2C_FIFO_SIZE);
  162. mutex_unlock(&ITG1010_i2c_mutex);
  163. return -EINVAL;
  164. }
  165. err = i2c_transfer(client->adapter, msgs, sizeof(msgs)/sizeof(msgs[0]));
  166. if (err != 2) {
  167. GYRO_ERR("i2c_transfer error: (%d %p %d) %d\n", addr, data, len, err);
  168. err = -EIO;
  169. } else
  170. err = 0;
  171. mutex_unlock(&ITG1010_i2c_mutex);
  172. return err;
  173. }
  174. static int ITG1010_i2c_write_block(struct i2c_client *client, u8 addr, u8 *data, u8 len)
  175. { /*because address also occupies one byte, the maximum length for write is 7 bytes*/
  176. int err, idx, num;
  177. char buf[C_I2C_FIFO_SIZE];
  178. err = 0;
  179. mutex_lock(&ITG1010_i2c_mutex);
  180. if (!client) {
  181. mutex_unlock(&ITG1010_i2c_mutex);
  182. return -EINVAL;
  183. } else if (len >= C_I2C_FIFO_SIZE) {
  184. GYRO_ERR(" length %d exceeds %d\n", len, C_I2C_FIFO_SIZE);
  185. mutex_unlock(&ITG1010_i2c_mutex);
  186. return -EINVAL;
  187. }
  188. num = 0;
  189. buf[num++] = addr;
  190. for (idx = 0; idx < len; idx++)
  191. buf[num++] = data[idx];
  192. err = i2c_master_send(client, buf, num);
  193. if (err < 0) {
  194. GYRO_ERR("send command error!!\n");
  195. mutex_unlock(&ITG1010_i2c_mutex);
  196. return -EFAULT;
  197. }
  198. mutex_unlock(&ITG1010_i2c_mutex);
  199. return err;
  200. }
  201. static unsigned int power_on;
  202. #if INV_GYRO_AUTO_CALI == 1
  203. #define INV_DAEMON_CLASS_NAME "invensense_daemon_class"
  204. #define INV_DAEMON_DEVICE_NAME "invensense_daemon_device"
  205. static struct class *inv_daemon_class;
  206. static struct device *inv_daemon_device;
  207. static int inv_mpl_motion_state;
  208. static int inv_gyro_power_state;
  209. static ssize_t inv_mpl_motion_store(struct device *dev,
  210. struct device_attribute *attr, const char *buf, size_t count)
  211. {
  212. unsigned int result;
  213. unsigned long data;
  214. char *envp[2];
  215. result = kstrtoul(buf, 10, &data);
  216. if (result)
  217. return result;
  218. if (data)
  219. envp[0] = "STATUS=MOTION";
  220. else
  221. envp[0] = "STATUS=NOMOTION";
  222. envp[1] = NULL;
  223. result = kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, envp);
  224. inv_mpl_motion_state = data;
  225. return count;
  226. }
  227. static ssize_t inv_mpl_motion_show(struct device *dev,
  228. struct device_attribute *attr, char *buf)
  229. {
  230. return sprintf(buf, "%d\n", inv_mpl_motion_state);
  231. }
  232. static ssize_t inv_gyro_data_ready_store(struct device *dev,
  233. struct device_attribute *attr, const char *buf, size_t count)
  234. {
  235. sysfs_notify(&dev->kobj, NULL, "inv_gyro_data_ready");
  236. return count;
  237. }
  238. static ssize_t inv_gyro_data_ready_show(struct device *dev,
  239. struct device_attribute *attr, char *buf)
  240. {
  241. return sprintf(buf, "1\n");
  242. }
  243. static ssize_t inv_gyro_power_state_store(struct device *dev,
  244. struct device_attribute *attr, const char *buf, size_t count)
  245. {
  246. unsigned int result;
  247. unsigned long data;
  248. result = kstrtoul(buf, 10, &data);
  249. if (result)
  250. return result;
  251. inv_gyro_power_state = data;
  252. sysfs_notify(&dev->kobj, NULL, "inv_gyro_power_state");
  253. return count;
  254. }
  255. static ssize_t inv_gyro_power_state_show(struct device *dev,
  256. struct device_attribute *attr, char *buf)
  257. {
  258. return sprintf(buf, "%d\n", inv_gyro_power_state);
  259. }
  260. static DEVICE_ATTR(inv_mpl_motion, S_IRUGO | S_IWUSR, inv_mpl_motion_show, inv_mpl_motion_store);
  261. static DEVICE_ATTR(inv_gyro_data_ready, S_IRUGO | S_IWUSR, inv_gyro_data_ready_show, inv_gyro_data_ready_store);
  262. static DEVICE_ATTR(inv_gyro_power_state, S_IRUGO | S_IWUSR, inv_gyro_power_state_show, inv_gyro_power_state_store);
  263. static struct device_attribute *inv_daemon_dev_attributes[] = {
  264. &dev_attr_inv_mpl_motion,
  265. &dev_attr_inv_gyro_data_ready,
  266. &dev_attr_inv_gyro_power_state,
  267. };
  268. #endif/* #if INV_GYRO_AUTO_CALI == 1 */
  269. int ITG1010_gyro_power(void)
  270. {
  271. return power_on;
  272. }
  273. EXPORT_SYMBOL(ITG1010_gyro_power);
  274. int ITG1010_gyro_mode(void)
  275. {
  276. return sensor_power;
  277. }
  278. EXPORT_SYMBOL(ITG1010_gyro_mode);
  279. /*--------------------gyroscopy power control function----------------------------------*/
  280. static void ITG1010_power(struct gyro_hw *hw, unsigned int on)
  281. {
  282. }
  283. /*----------------------------------------------------------------------------*/
  284. /*----------------------------------------------------------------------------*/
  285. static int ITG1010_write_rel_calibration(struct ITG1010_i2c_data *obj, int dat[ITG1010_AXES_NUM])
  286. {
  287. obj->cali_sw[ITG1010_AXIS_X] = obj->cvt.sign[ITG1010_AXIS_X]*dat[obj->cvt.map[ITG1010_AXIS_X]];
  288. obj->cali_sw[ITG1010_AXIS_Y] = obj->cvt.sign[ITG1010_AXIS_Y]*dat[obj->cvt.map[ITG1010_AXIS_Y]];
  289. obj->cali_sw[ITG1010_AXIS_Z] = obj->cvt.sign[ITG1010_AXIS_Z]*dat[obj->cvt.map[ITG1010_AXIS_Z]];
  290. #if DEBUG
  291. if (atomic_read(&obj->trace) & GYRO_TRC_CALI) {
  292. GYRO_LOG("test (%5d, %5d, %5d) ->(%5d, %5d, %5d)->(%5d, %5d, %5d))\n",
  293. obj->cvt.sign[ITG1010_AXIS_X], obj->cvt.sign[ITG1010_AXIS_Y], obj->cvt.sign[ITG1010_AXIS_Z],
  294. dat[ITG1010_AXIS_X], dat[ITG1010_AXIS_Y], dat[ITG1010_AXIS_Z],
  295. obj->cvt.map[ITG1010_AXIS_X], obj->cvt.map[ITG1010_AXIS_Y], obj->cvt.map[ITG1010_AXIS_Z]);
  296. GYRO_LOG("write gyro calibration data (%5d, %5d, %5d)\n",
  297. obj->cali_sw[ITG1010_AXIS_X], obj->cali_sw[ITG1010_AXIS_Y], obj->cali_sw[ITG1010_AXIS_Z]);
  298. }
  299. #endif
  300. return 0;
  301. }
  302. /*----------------------------------------------------------------------------*/
  303. static int ITG1010_ResetCalibration(struct i2c_client *client)
  304. {
  305. struct ITG1010_i2c_data *obj = i2c_get_clientdata(client);
  306. memset(obj->cali_sw, 0x00, sizeof(obj->cali_sw));
  307. return 0;
  308. }
  309. /*----------------------------------------------------------------------------*/
  310. static int ITG1010_ReadCalibration(struct i2c_client *client, int dat[ITG1010_AXES_NUM])
  311. {
  312. struct ITG1010_i2c_data *obj = i2c_get_clientdata(client);
  313. dat[obj->cvt.map[ITG1010_AXIS_X]] = obj->cvt.sign[ITG1010_AXIS_X]*obj->cali_sw[ITG1010_AXIS_X];
  314. dat[obj->cvt.map[ITG1010_AXIS_Y]] = obj->cvt.sign[ITG1010_AXIS_Y]*obj->cali_sw[ITG1010_AXIS_Y];
  315. dat[obj->cvt.map[ITG1010_AXIS_Z]] = obj->cvt.sign[ITG1010_AXIS_Z]*obj->cali_sw[ITG1010_AXIS_Z];
  316. #if DEBUG
  317. if (atomic_read(&obj->trace) & GYRO_TRC_CALI) {
  318. GYRO_LOG("Read gyro calibration data (%5d, %5d, %5d)\n",
  319. dat[ITG1010_AXIS_X], dat[ITG1010_AXIS_Y], dat[ITG1010_AXIS_Z]);
  320. }
  321. #endif
  322. return 0;
  323. }
  324. /*----------------------------------------------------------------------------*/
  325. /*----------------------------------------------------------------------------*/
  326. static int ITG1010_WriteCalibration(struct i2c_client *client, int dat[ITG1010_AXES_NUM])
  327. {
  328. struct ITG1010_i2c_data *obj = i2c_get_clientdata(client);
  329. int cali[ITG1010_AXES_NUM];
  330. GYRO_LOG();
  331. if (!obj || !dat) {
  332. GYRO_ERR("null ptr!!\n");
  333. return -EINVAL;
  334. }
  335. cali[obj->cvt.map[ITG1010_AXIS_X]] = obj->cvt.sign[ITG1010_AXIS_X]*obj->cali_sw[ITG1010_AXIS_X];
  336. cali[obj->cvt.map[ITG1010_AXIS_Y]] = obj->cvt.sign[ITG1010_AXIS_Y]*obj->cali_sw[ITG1010_AXIS_Y];
  337. cali[obj->cvt.map[ITG1010_AXIS_Z]] = obj->cvt.sign[ITG1010_AXIS_Z]*obj->cali_sw[ITG1010_AXIS_Z];
  338. cali[ITG1010_AXIS_X] += dat[ITG1010_AXIS_X];
  339. cali[ITG1010_AXIS_Y] += dat[ITG1010_AXIS_Y];
  340. cali[ITG1010_AXIS_Z] += dat[ITG1010_AXIS_Z];
  341. #if DEBUG
  342. if (atomic_read(&obj->trace) & GYRO_TRC_CALI) {
  343. GYRO_LOG("write gyro calibration data (%5d, %5d, %5d)-->(%5d, %5d, %5d)\n",
  344. dat[ITG1010_AXIS_X], dat[ITG1010_AXIS_Y], dat[ITG1010_AXIS_Z],
  345. cali[ITG1010_AXIS_X], cali[ITG1010_AXIS_Y], cali[ITG1010_AXIS_Z]);
  346. }
  347. #endif
  348. return ITG1010_write_rel_calibration(obj, cali);
  349. }
  350. /*----------------------------------------------------------------------------*/
  351. /* ----------------------------------------------------------------------------// */
  352. static int ITG1010_SetPowerMode(struct i2c_client *client, bool enable)
  353. {
  354. u8 databuf[2] = {0};
  355. int res = 0;
  356. if (enable == sensor_power) {
  357. GYRO_LOG("Sensor power status is newest!\n");
  358. return ITG1010_SUCCESS;
  359. }
  360. if (ITG1010_i2c_read_block(client, ITG1010_REG_PWR_CTL, databuf, 1)) {
  361. GYRO_ERR("read power ctl register err!\n");
  362. return ITG1010_ERR_I2C;
  363. }
  364. databuf[0] &= ~ITG1010_SLEEP;
  365. if (enable == FALSE)
  366. databuf[0] |= ITG1010_SLEEP;
  367. res = ITG1010_i2c_write_block(client, ITG1010_REG_PWR_CTL, databuf, 1);
  368. if (res <= 0) {
  369. GYRO_LOG("set power mode failed!\n");
  370. return ITG1010_ERR_I2C;
  371. }
  372. /* GYRO_LOG("set power mode ok %d!\n", enable); */
  373. sensor_power = enable;
  374. return ITG1010_SUCCESS;
  375. }
  376. /*----------------------------------------------------------------------------*/
  377. static int ITG1010_SetDataFormat(struct i2c_client *client, u8 dataformat)
  378. {
  379. u8 databuf[2] = {0};
  380. int res = 0;
  381. /* GYRO_LOG(); */
  382. databuf[0] = dataformat;
  383. res = ITG1010_i2c_write_block(client, ITG1010_REG_CFG, databuf, 1);
  384. if (res <= 0)
  385. return ITG1010_ERR_I2C;
  386. /* read sample rate after written for test */
  387. udelay(500);
  388. res = ITG1010_i2c_read_block(client, ITG1010_REG_CFG, databuf, 1);
  389. if (res != 0) {
  390. GYRO_ERR("read data format register err!\n");
  391. return ITG1010_ERR_I2C;
  392. }
  393. /* GYRO_LOG("read data format: 0x%x\n", databuf[0]); */
  394. return ITG1010_SUCCESS;
  395. }
  396. static int ITG1010_SetFullScale(struct i2c_client *client, u8 dataformat)
  397. {
  398. u8 databuf[2] = {0};
  399. int res = 0;
  400. /* GYRO_LOG(); */
  401. databuf[0] = dataformat;
  402. res = ITG1010_i2c_write_block(client, ITG1010_REG_GYRO_CFG, databuf, 1);
  403. if (res <= 0)
  404. return ITG1010_ERR_I2C;
  405. /* read sample rate after written for test */
  406. udelay(500);
  407. res = ITG1010_i2c_read_block(client, ITG1010_REG_GYRO_CFG, databuf, 1);
  408. if (res != 0) {
  409. GYRO_ERR("read data format register err!\n");
  410. return ITG1010_ERR_I2C;
  411. }
  412. /* GYRO_LOG("read data format: 0x%x\n", databuf[0]); */
  413. return ITG1010_SUCCESS;
  414. }
  415. /* set the sample rate */
  416. static int ITG1010_SetSampleRate(struct i2c_client *client, int sample_rate)
  417. {
  418. u8 databuf[2] = {0};
  419. int rate_div = 0;
  420. int res = 0;
  421. /* GYRO_LOG(); */
  422. res = ITG1010_i2c_read_block(client, ITG1010_REG_CFG, databuf, 1);
  423. if (res != 0) {
  424. GYRO_ERR("read gyro data format register err!\n");
  425. return ITG1010_ERR_I2C;
  426. }
  427. /* GYRO_LOG("read gyro data format register: 0x%x\n", databuf[0]); */
  428. if ((databuf[0] & 0x07) == 0) /* Analog sample rate is 8KHz */
  429. rate_div = 8 * 1024 / sample_rate - 1;
  430. else /* 1kHz */
  431. rate_div = 1024 / sample_rate - 1;
  432. if (rate_div > 255) /* rate_div: 0 to 255; */
  433. rate_div = 255;
  434. else if (rate_div < 0)
  435. rate_div = 0;
  436. databuf[0] = rate_div;
  437. res = ITG1010_i2c_write_block(client, ITG1010_REG_SAMRT_DIV, databuf, 1);
  438. if (res <= 0) {
  439. GYRO_ERR("write sample rate register err!\n");
  440. return ITG1010_ERR_I2C;
  441. }
  442. /* read sample div after written for test */
  443. udelay(500);
  444. res = ITG1010_i2c_read_block(client, ITG1010_REG_SAMRT_DIV, databuf, 1);
  445. if (res != 0) {
  446. GYRO_ERR("read gyro sample rate register err!\n");
  447. return ITG1010_ERR_I2C;
  448. }
  449. /* GYRO_LOG("read gyro sample rate: 0x%x\n", databuf[0]); */
  450. return ITG1010_SUCCESS;
  451. }
  452. /*----------------------------------------------------------------------------*/
  453. /*----------------------------------------------------------------------------*/
  454. static int ITG1010_ReadGyroData(struct i2c_client *client, char *buf, int bufsize)
  455. {
  456. char databuf[6];
  457. int data[3];
  458. int ret = 0;
  459. struct ITG1010_i2c_data *obj = i2c_get_clientdata(client);
  460. if (sensor_power == false) {
  461. ITG1010_SetPowerMode(client, true);
  462. mdelay(50);
  463. }
  464. #if INV_GYRO_AUTO_CALI == 1
  465. ret = ITG1010_i2c_read_block(client, ITG1010_REG_TEMPH, databuf, 2);
  466. if (ret != 0) {
  467. GYRO_ERR("ITG1010 read temperature data error\n");
  468. return -2;
  469. }
  470. mutex_lock(&obj->temperature_mutex);
  471. obj->temperature = ((s16)((databuf[1]) | (databuf[0] << 8)));
  472. mutex_unlock(&obj->temperature_mutex);
  473. #endif
  474. ret = ITG1010_i2c_read_block(client, ITG1010_REG_GYRO_XH, databuf, 6);
  475. if (ret != 0) {
  476. GYRO_ERR("ITG1010 read gyroscope data error\n");
  477. return -2;
  478. }
  479. obj->data[ITG1010_AXIS_X] = ((s16)((databuf[ITG1010_AXIS_X*2+1]) | (databuf[ITG1010_AXIS_X*2] << 8)));
  480. obj->data[ITG1010_AXIS_Y] = ((s16)((databuf[ITG1010_AXIS_Y*2+1]) | (databuf[ITG1010_AXIS_Y*2] << 8)));
  481. obj->data[ITG1010_AXIS_Z] = ((s16)((databuf[ITG1010_AXIS_Z*2+1]) | (databuf[ITG1010_AXIS_Z*2] << 8)));
  482. #if DEBUG
  483. if (atomic_read(&obj->trace) & GYRO_TRC_RAWDATA) {
  484. GYRO_LOG("read gyro register: %d, %d, %d, %d, %d, %d",
  485. databuf[0], databuf[1], databuf[2], databuf[3], databuf[4], databuf[5]);
  486. GYRO_LOG("get gyro raw data (0x%08X, 0x%08X, 0x%08X) -> (%5d, %5d, %5d)\n",
  487. obj->data[ITG1010_AXIS_X], obj->data[ITG1010_AXIS_Y], obj->data[ITG1010_AXIS_Z],
  488. obj->data[ITG1010_AXIS_X], obj->data[ITG1010_AXIS_Y], obj->data[ITG1010_AXIS_Z]);
  489. }
  490. #endif
  491. #if INV_GYRO_AUTO_CALI == 1
  492. mutex_lock(&obj->raw_data_mutex);
  493. /*remap coordinate*/
  494. obj->inv_cali_raw[obj->cvt.map[ITG1010_AXIS_X]] = obj->cvt.sign[ITG1010_AXIS_X]*obj->data[ITG1010_AXIS_X];
  495. obj->inv_cali_raw[obj->cvt.map[ITG1010_AXIS_Y]] = obj->cvt.sign[ITG1010_AXIS_Y]*obj->data[ITG1010_AXIS_Y];
  496. obj->inv_cali_raw[obj->cvt.map[ITG1010_AXIS_Z]] = obj->cvt.sign[ITG1010_AXIS_Z]*obj->data[ITG1010_AXIS_Z];
  497. mutex_unlock(&obj->raw_data_mutex);
  498. #endif
  499. obj->data[ITG1010_AXIS_X] = obj->data[ITG1010_AXIS_X] + obj->cali_sw[ITG1010_AXIS_X];
  500. obj->data[ITG1010_AXIS_Y] = obj->data[ITG1010_AXIS_Y] + obj->cali_sw[ITG1010_AXIS_Y];
  501. obj->data[ITG1010_AXIS_Z] = obj->data[ITG1010_AXIS_Z] + obj->cali_sw[ITG1010_AXIS_Z];
  502. /*remap coordinate*/
  503. data[obj->cvt.map[ITG1010_AXIS_X]] = obj->cvt.sign[ITG1010_AXIS_X]*obj->data[ITG1010_AXIS_X];
  504. data[obj->cvt.map[ITG1010_AXIS_Y]] = obj->cvt.sign[ITG1010_AXIS_Y]*obj->data[ITG1010_AXIS_Y];
  505. data[obj->cvt.map[ITG1010_AXIS_Z]] = obj->cvt.sign[ITG1010_AXIS_Z]*obj->data[ITG1010_AXIS_Z];
  506. /* Out put the degree/second(o/s) */
  507. data[ITG1010_AXIS_X] = data[ITG1010_AXIS_X] * ITG1010_FS_MAX_LSB / ITG1010_DEFAULT_LSB;
  508. data[ITG1010_AXIS_Y] = data[ITG1010_AXIS_Y] * ITG1010_FS_MAX_LSB / ITG1010_DEFAULT_LSB;
  509. data[ITG1010_AXIS_Z] = data[ITG1010_AXIS_Z] * ITG1010_FS_MAX_LSB / ITG1010_DEFAULT_LSB;
  510. sprintf(buf, "%04x %04x %04x", data[ITG1010_AXIS_X], data[ITG1010_AXIS_Y], data[ITG1010_AXIS_Z]);
  511. #if DEBUG
  512. if (atomic_read(&obj->trace) & GYRO_TRC_DATA)
  513. GYRO_LOG("get gyro data packet:[%d %d %d]\n", data[0], data[1], data[2]);
  514. #endif
  515. return 0;
  516. }
  517. static int ITG1010_ReadChipInfo(struct i2c_client *client, char *buf, int bufsize)
  518. {
  519. u8 databuf[10];
  520. memset(databuf, 0, sizeof(u8)*10);
  521. if ((NULL == buf) || (bufsize <= 30))
  522. return -1;
  523. if (NULL == client) {
  524. *buf = 0;
  525. return -2;
  526. }
  527. sprintf(buf, "ITG1010 Chip");
  528. return 0;
  529. }
  530. #if INV_GYRO_AUTO_CALI == 1
  531. /*----------------------------------------------------------------------------*/
  532. static int ITG1010_ReadGyroDataRaw(struct i2c_client *client, char *buf, int bufsize)
  533. {
  534. struct ITG1010_i2c_data *obj = i2c_get_clientdata(client);
  535. mutex_lock(&obj->raw_data_mutex);
  536. /* return gyro raw LSB in device orientation */
  537. sprintf(buf, "%x %x %x", obj->inv_cali_raw[ITG1010_AXIS_X], obj->inv_cali_raw[ITG1010_AXIS_Y],
  538. obj->inv_cali_raw[ITG1010_AXIS_Z]);
  539. #if DEBUG
  540. if (atomic_read(&obj->trace) & GYRO_TRC_DATA)
  541. GYRO_LOG("get gyro raw data packet:[%d %d %d]\n", obj->inv_cali_raw[0], obj->inv_cali_raw[1],
  542. obj->inv_cali_raw[2]);
  543. #endif
  544. mutex_unlock(&obj->raw_data_mutex);
  545. return 0;
  546. }
  547. /*----------------------------------------------------------------------------*/
  548. static int ITG1010_ReadTemperature(struct i2c_client *client, char *buf, int bufsize)
  549. {
  550. struct ITG1010_i2c_data *obj = i2c_get_clientdata(client);
  551. mutex_lock(&obj->temperature_mutex);
  552. sprintf(buf, "%x", obj->temperature);
  553. #if DEBUG
  554. if (atomic_read(&obj->trace) & GYRO_TRC_DATA)
  555. GYRO_LOG("get gyro temperature:[%d]\n", obj->temperature);
  556. #endif
  557. mutex_unlock(&obj->temperature_mutex);
  558. return 0;
  559. }
  560. /*----------------------------------------------------------------------------*/
  561. static int ITG1010_ReadPowerStatus(struct i2c_client *client, char *buf, int bufsize)
  562. {
  563. #if DEBUG
  564. GYRO_LOG("get gyro PowerStatus:[%d]\n", sensor_power);
  565. #endif
  566. sprintf(buf, "%x", sensor_power);
  567. return 0;
  568. }
  569. #endif
  570. /*----------------------------------------------------------------------------*/
  571. static ssize_t show_chipinfo_value(struct device_driver *ddri, char *buf)
  572. {
  573. struct i2c_client *client = ITG1010_i2c_client;
  574. char strbuf[ITG1010_BUFSIZE];
  575. if (NULL == client) {
  576. GYRO_ERR("i2c client is null!!\n");
  577. return 0;
  578. }
  579. ITG1010_ReadChipInfo(client, strbuf, ITG1010_BUFSIZE);
  580. return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
  581. }
  582. /*----------------------------------------------------------------------------*/
  583. static ssize_t show_sensordata_value(struct device_driver *ddri, char *buf)
  584. {
  585. struct i2c_client *client = ITG1010_i2c_client;
  586. char strbuf[ITG1010_BUFSIZE];
  587. if (NULL == client) {
  588. GYRO_ERR("i2c client is null!!\n");
  589. return 0;
  590. }
  591. ITG1010_ReadGyroData(client, strbuf, ITG1010_BUFSIZE);
  592. return snprintf(buf, PAGE_SIZE, "%s\n", strbuf);
  593. }
  594. /*----------------------------------------------------------------------------*/
  595. static ssize_t show_trace_value(struct device_driver *ddri, char *buf)
  596. {
  597. ssize_t res;
  598. struct ITG1010_i2c_data *obj = obj_i2c_data;
  599. if (obj == NULL) {
  600. GYRO_ERR("i2c_data obj is null!!\n");
  601. return 0;
  602. }
  603. res = snprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&obj->trace));
  604. return res;
  605. }
  606. /*----------------------------------------------------------------------------*/
  607. static ssize_t store_trace_value(struct device_driver *ddri, const char *buf, size_t count)
  608. {
  609. struct ITG1010_i2c_data *obj = obj_i2c_data;
  610. int trace;
  611. if (obj == NULL) {
  612. GYRO_ERR("i2c_data obj is null!!\n");
  613. return 0;
  614. }
  615. if (1 == sscanf(buf, "0x%x", &trace))
  616. atomic_set(&obj->trace, trace);
  617. else
  618. GYRO_ERR("invalid content: '%s', length = %zu\n", buf, count);
  619. return count;
  620. }
  621. /*----------------------------------------------------------------------------*/
  622. static ssize_t show_status_value(struct device_driver *ddri, char *buf)
  623. {
  624. ssize_t len = 0;
  625. struct ITG1010_i2c_data *obj = obj_i2c_data;
  626. if (obj == NULL) {
  627. GYRO_ERR("i2c_data obj is null!!\n");
  628. return 0;
  629. }
  630. if (obj->hw)
  631. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: %d %d (%d %d)\n",
  632. obj->hw->i2c_num, obj->hw->direction, obj->hw->power_id, obj->hw->power_vol);
  633. else
  634. len += snprintf(buf+len, PAGE_SIZE-len, "CUST: NULL\n");
  635. return len;
  636. }
  637. static ssize_t show_chip_orientation(struct device_driver *ddri, char *buf)
  638. {
  639. ssize_t _tLength = 0;
  640. struct gyro_hw *_ptAccelHw = hw;
  641. GYRO_LOG("[%s] default direction: %d\n", __func__, _ptAccelHw->direction);
  642. _tLength = snprintf(buf, PAGE_SIZE, "default direction = %d\n", _ptAccelHw->direction);
  643. return _tLength;
  644. }
  645. static ssize_t store_chip_orientation(struct device_driver *ddri, const char *buf, size_t tCount)
  646. {
  647. int _nDirection = 0;
  648. int ret = 0;
  649. struct ITG1010_i2c_data *_pt_i2c_obj = obj_i2c_data;
  650. if (NULL == _pt_i2c_obj)
  651. return 0;
  652. ret = kstrtoint(buf, 10, &_nDirection);
  653. if (ret != 0) {
  654. if (hwmsen_get_convert(_nDirection, &_pt_i2c_obj->cvt))
  655. GYRO_ERR("ERR: fail to set direction\n");
  656. }
  657. GYRO_LOG("[%s] set direction: %d\n", __func__, _nDirection);
  658. return tCount;
  659. }
  660. static ssize_t show_power_status(struct device_driver *ddri, char *buf)
  661. {
  662. ssize_t res = 0;
  663. u8 uData = 0;
  664. struct ITG1010_i2c_data *obj = obj_i2c_data;
  665. if (obj == NULL) {
  666. GYRO_ERR("i2c_data obj is null!!\n");
  667. return 0;
  668. }
  669. ITG1010_i2c_read_block(obj->client, ITG1010_REG_PWR_CTL, &uData, 1);
  670. res = snprintf(buf, PAGE_SIZE, "0x%04X\n", uData);
  671. return res;
  672. }
  673. static ssize_t show_regiter_map(struct device_driver *ddri, char *buf)
  674. {
  675. u8 _bIndex = 0;
  676. u8 _baRegMap[34] = {0x04, 0x05, 0x07, 0x08, 0xA, 0xB, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B
  677. , 0x23, 0x37, 0x38, 0x3A, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x6A, 0x6B, 0x6C
  678. , 0x72, 0x73, 0x74, 0x75};
  679. u8 _baRegValue[2] = {0};
  680. ssize_t _tLength = 0;
  681. struct ITG1010_i2c_data *obj = obj_i2c_data;
  682. for (_bIndex = 0; _bIndex < 34; _bIndex++) {
  683. ITG1010_i2c_read_block(obj->client, _baRegMap[_bIndex], &_baRegValue[0], 1);
  684. _tLength += snprintf((buf + _tLength), (PAGE_SIZE - _tLength), "Reg[0x%02X]: 0x%02X\n"
  685. , _baRegMap[_bIndex], _baRegValue[0]);
  686. }
  687. return _tLength;
  688. }
  689. /*----------------------------------------------------------------------------*/
  690. static DRIVER_ATTR(chipinfo, S_IRUGO, show_chipinfo_value, NULL);
  691. static DRIVER_ATTR(sensordata, S_IRUGO, show_sensordata_value, NULL);
  692. static DRIVER_ATTR(trace, S_IWUSR | S_IRUGO, show_trace_value, store_trace_value);
  693. static DRIVER_ATTR(status, S_IRUGO, show_status_value, NULL);
  694. static DRIVER_ATTR(orientation, S_IWUSR | S_IRUGO, show_chip_orientation, store_chip_orientation);
  695. static DRIVER_ATTR(power, S_IRUGO, show_power_status, NULL);
  696. static DRIVER_ATTR(regmap, S_IRUGO, show_regiter_map, NULL);
  697. /*----------------------------------------------------------------------------*/
  698. static struct driver_attribute *ITG1010_attr_list[] = {
  699. &driver_attr_chipinfo, /*chip information*/
  700. &driver_attr_sensordata, /*dump sensor data*/
  701. &driver_attr_trace, /*trace log*/
  702. &driver_attr_status,
  703. &driver_attr_orientation,
  704. &driver_attr_power,
  705. &driver_attr_regmap,
  706. };
  707. /*----------------------------------------------------------------------------*/
  708. static int ITG1010_create_attr(struct device_driver *driver)
  709. {
  710. int idx, err = 0;
  711. int num = (int)(sizeof(ITG1010_attr_list)/sizeof(ITG1010_attr_list[0]));
  712. if (driver == NULL)
  713. return -EINVAL;
  714. for (idx = 0; idx < num; idx++) {
  715. err = driver_create_file(driver, ITG1010_attr_list[idx]);
  716. if (0 != err) {
  717. GYRO_ERR("driver_create_file (%s) = %d\n", ITG1010_attr_list[idx]->attr.name, err);
  718. break;
  719. }
  720. }
  721. return err;
  722. }
  723. /*----------------------------------------------------------------------------*/
  724. static int ITG1010_delete_attr(struct device_driver *driver)
  725. {
  726. int idx , err = 0;
  727. int num = (int)(sizeof(ITG1010_attr_list)/sizeof(ITG1010_attr_list[0]));
  728. if (driver == NULL)
  729. return -EINVAL;
  730. for (idx = 0; idx < num; idx++)
  731. driver_remove_file(driver, ITG1010_attr_list[idx]);
  732. return err;
  733. }
  734. /*----------------------------------------------------------------------------*/
  735. static int ITG1010_gpio_config(void)
  736. {
  737. int ret;
  738. struct pinctrl *pinctrl;
  739. struct pinctrl_state *pins_default;
  740. struct pinctrl_state *pins_cfg;
  741. pinctrl = devm_pinctrl_get(&gyroPltFmDev->dev);
  742. if (IS_ERR(pinctrl)) {
  743. ret = PTR_ERR(pinctrl);
  744. GYRO_ERR("Cannot find gyro pinctrl!\n");
  745. }
  746. pins_default = pinctrl_lookup_state(pinctrl, "pin_default");
  747. if (IS_ERR(pins_default)) {
  748. ret = PTR_ERR(pins_default);
  749. GYRO_ERR("Cannot find gyro pinctrl default!\n");
  750. }
  751. pins_cfg = pinctrl_lookup_state(pinctrl, "pin_cfg");
  752. if (IS_ERR(pins_cfg)) {
  753. ret = PTR_ERR(pins_cfg);
  754. GYRO_ERR("Cannot find gyro pinctrl pin_cfg!\n");
  755. }
  756. pinctrl_select_state(pinctrl, pins_cfg);
  757. return 0;
  758. }
  759. static int ITG1010_init_client(struct i2c_client *client, bool enable)
  760. {
  761. struct ITG1010_i2c_data *obj = i2c_get_clientdata(client);
  762. int res = 0;
  763. /* GYRO_LOG(); */
  764. ITG1010_gpio_config();
  765. res = ITG1010_SetPowerMode(client, true);
  766. if (res != ITG1010_SUCCESS)
  767. return res;
  768. /* The range should at least be 17.45 rad/s (ie: ~1000 deg/s). */
  769. res = ITG1010_SetDataFormat(client, (ITG1010_SYNC_GYROX << ITG1010_EXT_SYNC)|
  770. ITG1010_RATE_1K_LPFB_188HZ);
  771. res = ITG1010_SetFullScale(client, (ITG1010_DEFAULT_FS << ITG1010_FS_RANGE));
  772. if (res != ITG1010_SUCCESS)
  773. return res;
  774. /* Set 125HZ sample rate */
  775. res = ITG1010_SetSampleRate(client, 125);
  776. if (res != ITG1010_SUCCESS)
  777. return res;
  778. res = ITG1010_SetPowerMode(client, enable);
  779. if (res != ITG1010_SUCCESS)
  780. return res;
  781. /* GYRO_LOG("ITG1010_init_client OK!\n"); */
  782. #ifdef CONFIG_ITG1010_LOWPASS
  783. memset(&obj->fir, 0x00, sizeof(obj->fir));
  784. #endif
  785. return ITG1010_SUCCESS;
  786. }
  787. /*----------------------------------------------------------------------------*/
  788. int ITG1010_operate(void *self, uint32_t command, void *buff_in, int size_in,
  789. void *buff_out, int size_out, int *actualout)
  790. {
  791. int err = 0;
  792. int ret = 0;
  793. int value;
  794. struct ITG1010_i2c_data *priv = (struct ITG1010_i2c_data *)self;
  795. struct hwm_sensor_data *gyro_data;
  796. char buff[ITG1010_BUFSIZE];
  797. switch (command) {
  798. case SENSOR_DELAY:
  799. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  800. GYRO_ERR("Set delay parameter error!\n");
  801. err = -EINVAL;
  802. }
  803. break;
  804. case SENSOR_ENABLE:
  805. if ((buff_in == NULL) || (size_in < sizeof(int))) {
  806. GYRO_ERR("Enable gyroscope parameter error!\n");
  807. err = -EINVAL;
  808. } else {
  809. value = *(int *)buff_in;
  810. if (((value == 0) && (sensor_power == false)) || ((value == 1) && (sensor_power == true)))
  811. GYRO_LOG("gyroscope device have updated!\n");
  812. else
  813. err = ITG1010_SetPowerMode(priv->client, !sensor_power);
  814. #if INV_GYRO_AUTO_CALI == 1
  815. inv_gyro_power_state = sensor_power;
  816. /* put this in where gyro power is changed, waking up mpu daemon */
  817. sysfs_notify(&inv_daemon_device->kobj, NULL, "inv_gyro_power_state");
  818. #endif
  819. }
  820. break;
  821. case SENSOR_GET_DATA:
  822. if ((buff_out == NULL) || (size_out < sizeof(struct hwm_sensor_data))) {
  823. GYRO_ERR("get gyroscope data parameter error!\n");
  824. err = -EINVAL;
  825. } else {
  826. gyro_data = (struct hwm_sensor_data *)buff_out;
  827. err = ITG1010_ReadGyroData(priv->client, buff, ITG1010_BUFSIZE);
  828. if (!err) {
  829. ret = sscanf(buff, "%x %x %x", &gyro_data->values[0], &gyro_data->values[1]
  830. , &gyro_data->values[2]);
  831. gyro_data->status = SENSOR_STATUS_ACCURACY_MEDIUM;
  832. gyro_data->value_divide = DEGREE_TO_RAD;
  833. #if INV_GYRO_AUTO_CALI == 1
  834. /* put this in where gyro data is ready to report to hal, waking up mpu daemon */
  835. sysfs_notify(&inv_daemon_device->kobj, NULL, "inv_gyro_data_ready");
  836. #endif
  837. }
  838. }
  839. break;
  840. default:
  841. GYRO_ERR("gyroscope operate function no this parameter %d!\n", command);
  842. err = -1;
  843. }
  844. return err;
  845. }
  846. /******************************************************************************
  847. * Function Configuration
  848. ******************************************************************************/
  849. static int ITG1010_open(struct inode *inode, struct file *file)
  850. {
  851. file->private_data = ITG1010_i2c_client;
  852. if (file->private_data == NULL) {
  853. GYRO_ERR("null pointer!!\n");
  854. return -EINVAL;
  855. }
  856. return nonseekable_open(inode, file);
  857. }
  858. /*----------------------------------------------------------------------------*/
  859. static int ITG1010_release(struct inode *inode, struct file *file)
  860. {
  861. file->private_data = NULL;
  862. return 0;
  863. }
  864. /*----------------------------------------------------------------------------*/
  865. static long ITG1010_unlocked_ioctl(struct file *file, unsigned int cmd,
  866. unsigned long arg)
  867. {
  868. struct i2c_client *client = (struct i2c_client *)file->private_data;
  869. char strbuf[ITG1010_BUFSIZE] = {0};
  870. void __user *data;
  871. long err = 0;
  872. int copy_cnt = 0;
  873. struct SENSOR_DATA sensor_data;
  874. int cali[3];
  875. int smtRes = 0;
  876. if (_IOC_DIR(cmd) & _IOC_READ)
  877. err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
  878. else if (_IOC_DIR(cmd) & _IOC_WRITE)
  879. err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
  880. if (err) {
  881. GYRO_ERR("access error: %08X, (%2d, %2d)\n", cmd, _IOC_DIR(cmd), _IOC_SIZE(cmd));
  882. return -EFAULT;
  883. }
  884. switch (cmd) {
  885. case GYROSCOPE_IOCTL_INIT:
  886. ITG1010_init_client(client, false);
  887. break;
  888. case GYROSCOPE_IOCTL_SMT_DATA:
  889. data = (void __user *) arg;
  890. if (data == NULL) {
  891. err = -EINVAL;
  892. break;
  893. }
  894. GYRO_LOG("ioctl smtRes: %d!\n", smtRes);
  895. copy_cnt = copy_to_user(data, &smtRes, sizeof(smtRes));
  896. if (copy_cnt) {
  897. err = -EFAULT;
  898. GYRO_ERR("copy gyro data to user failed!\n");
  899. }
  900. GYRO_LOG("copy gyro data to user OK: %d!\n", copy_cnt);
  901. break;
  902. case GYROSCOPE_IOCTL_READ_SENSORDATA:
  903. data = (void __user *) arg;
  904. if (data == NULL) {
  905. err = -EINVAL;
  906. break;
  907. }
  908. ITG1010_ReadGyroData(client, strbuf, ITG1010_BUFSIZE);
  909. if (copy_to_user(data, strbuf, sizeof(strbuf))) {
  910. err = -EFAULT;
  911. break;
  912. }
  913. break;
  914. case GYROSCOPE_IOCTL_SET_CALI:
  915. data = (void __user *)arg;
  916. if (data == NULL) {
  917. err = -EINVAL;
  918. break;
  919. }
  920. if (copy_from_user(&sensor_data, data, sizeof(sensor_data)))
  921. err = -EFAULT;
  922. else {
  923. cali[ITG1010_AXIS_X] = sensor_data.x * ITG1010_DEFAULT_LSB / ITG1010_FS_MAX_LSB;
  924. cali[ITG1010_AXIS_Y] = sensor_data.y * ITG1010_DEFAULT_LSB / ITG1010_FS_MAX_LSB;
  925. cali[ITG1010_AXIS_Z] = sensor_data.z * ITG1010_DEFAULT_LSB / ITG1010_FS_MAX_LSB;
  926. GYRO_LOG("gyro set cali:[%5d %5d %5d]\n",
  927. cali[ITG1010_AXIS_X], cali[ITG1010_AXIS_Y], cali[ITG1010_AXIS_Z]);
  928. err = ITG1010_WriteCalibration(client, cali);
  929. }
  930. break;
  931. case GYROSCOPE_IOCTL_CLR_CALI:
  932. err = ITG1010_ResetCalibration(client);
  933. break;
  934. case GYROSCOPE_IOCTL_GET_CALI:
  935. data = (void __user *)arg;
  936. if (data == NULL) {
  937. err = -EINVAL;
  938. break;
  939. }
  940. err = ITG1010_ReadCalibration(client, cali);
  941. if (err)
  942. break;
  943. sensor_data.x = cali[ITG1010_AXIS_X] * ITG1010_FS_MAX_LSB / ITG1010_DEFAULT_LSB;
  944. sensor_data.y = cali[ITG1010_AXIS_Y] * ITG1010_FS_MAX_LSB / ITG1010_DEFAULT_LSB;
  945. sensor_data.z = cali[ITG1010_AXIS_Z] * ITG1010_FS_MAX_LSB / ITG1010_DEFAULT_LSB;
  946. if (copy_to_user(data, &sensor_data, sizeof(sensor_data))) {
  947. err = -EFAULT;
  948. break;
  949. }
  950. break;
  951. #if INV_GYRO_AUTO_CALI == 1
  952. case GYROSCOPE_IOCTL_READ_SENSORDATA_RAW:
  953. data = (void __user *) arg;
  954. if (data == NULL) {
  955. err = -EINVAL;
  956. break;
  957. }
  958. ITG1010_ReadGyroDataRaw(client, strbuf, ITG1010_BUFSIZE);
  959. if (copy_to_user(data, strbuf, sizeof(strbuf))) {
  960. err = -EFAULT;
  961. break;
  962. }
  963. break;
  964. case GYROSCOPE_IOCTL_READ_TEMPERATURE:
  965. data = (void __user *) arg;
  966. if (data == NULL) {
  967. err = -EINVAL;
  968. break;
  969. }
  970. ITG1010_ReadTemperature(client, strbuf, ITG1010_BUFSIZE);
  971. if (copy_to_user(data, strbuf, sizeof(strbuf))) {
  972. err = -EFAULT;
  973. break;
  974. }
  975. break;
  976. case GYROSCOPE_IOCTL_GET_POWER_STATUS:
  977. data = (void __user *) arg;
  978. if (data == NULL) {
  979. err = -EINVAL;
  980. break;
  981. }
  982. ITG1010_ReadPowerStatus(client, strbuf, ITG1010_BUFSIZE);
  983. if (copy_to_user(data, strbuf, sizeof(strbuf))) {
  984. err = -EFAULT;
  985. break;
  986. }
  987. break;
  988. #endif
  989. default:
  990. GYRO_ERR("unknown IOCTL: 0x%08x\n", cmd);
  991. err = -ENOIOCTLCMD;
  992. }
  993. return err;
  994. }
  995. #ifdef CONFIG_COMPAT
  996. static long ITG1010_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  997. {
  998. long ret = 0;
  999. void __user *arg32 = compat_ptr(arg);
  1000. if (!file->f_op || !file->f_op->unlocked_ioctl)
  1001. return -ENOTTY;
  1002. switch (cmd) {
  1003. case COMPAT_GYROSCOPE_IOCTL_INIT:
  1004. if (arg32 == NULL) {
  1005. GYRO_ERR("invalid argument.");
  1006. return -EINVAL;
  1007. }
  1008. ret = file->f_op->unlocked_ioctl(file, GYROSCOPE_IOCTL_INIT, (unsigned long)arg32);
  1009. if (ret) {
  1010. GYRO_ERR("GYROSCOPE_IOCTL_INIT unlocked_ioctl failed.");
  1011. return ret;
  1012. }
  1013. break;
  1014. case COMPAT_GYROSCOPE_IOCTL_SET_CALI:
  1015. if (arg32 == NULL) {
  1016. GYRO_ERR("invalid argument.");
  1017. return -EINVAL;
  1018. }
  1019. ret = file->f_op->unlocked_ioctl(file, GYROSCOPE_IOCTL_SET_CALI, (unsigned long)arg32);
  1020. if (ret) {
  1021. GYRO_ERR("GYROSCOPE_IOCTL_SET_CALI unlocked_ioctl failed.");
  1022. return ret;
  1023. }
  1024. break;
  1025. case COMPAT_GYROSCOPE_IOCTL_CLR_CALI:
  1026. if (arg32 == NULL) {
  1027. GYRO_ERR("invalid argument.");
  1028. return -EINVAL;
  1029. }
  1030. ret = file->f_op->unlocked_ioctl(file, GYROSCOPE_IOCTL_CLR_CALI,
  1031. (unsigned long)arg32);
  1032. if (ret) {
  1033. GYRO_ERR("GYROSCOPE_IOCTL_CLR_CALI unlocked_ioctl failed.");
  1034. return ret;
  1035. }
  1036. break;
  1037. case COMPAT_GYROSCOPE_IOCTL_GET_CALI:
  1038. if (arg32 == NULL) {
  1039. GYRO_ERR("invalid argument.");
  1040. return -EINVAL;
  1041. }
  1042. ret = file->f_op->unlocked_ioctl(file, GYROSCOPE_IOCTL_GET_CALI,
  1043. (unsigned long)arg32);
  1044. if (ret) {
  1045. GYRO_ERR("GYROSCOPE_IOCTL_GET_CALI unlocked_ioctl failed.");
  1046. return ret;
  1047. }
  1048. break;
  1049. case COMPAT_GYROSCOPE_IOCTL_READ_SENSORDATA:
  1050. if (arg32 == NULL) {
  1051. GYRO_ERR("invalid argument.");
  1052. return -EINVAL;
  1053. }
  1054. ret = file->f_op->unlocked_ioctl(file, GYROSCOPE_IOCTL_READ_SENSORDATA,
  1055. (unsigned long)arg32);
  1056. if (ret) {
  1057. GYRO_ERR("GYROSCOPE_IOCTL_READ_SENSORDATA unlocked_ioctl failed.");
  1058. return ret;
  1059. }
  1060. break;
  1061. default:
  1062. GYRO_ERR("%s not supported = 0x%04x", __func__, cmd);
  1063. return -ENOIOCTLCMD;
  1064. }
  1065. return ret;
  1066. }
  1067. #endif
  1068. /*----------------------------------------------------------------------------*/
  1069. static const struct file_operations ITG1010_fops = {
  1070. .open = ITG1010_open,
  1071. .release = ITG1010_release,
  1072. .unlocked_ioctl = ITG1010_unlocked_ioctl,
  1073. #ifdef CONFIG_COMPAT
  1074. .compat_ioctl = ITG1010_compat_ioctl,
  1075. #endif
  1076. };
  1077. /*----------------------------------------------------------------------------*/
  1078. static struct miscdevice ITG1010_device = {
  1079. .minor = MISC_DYNAMIC_MINOR,
  1080. .name = "gyroscope",
  1081. .fops = &ITG1010_fops,
  1082. };
  1083. /*----------------------------------------------------------------------------*/
  1084. static int ITG1010_suspend(struct i2c_client *client, pm_message_t msg)
  1085. {
  1086. int err = 0;
  1087. struct ITG1010_i2c_data *obj = i2c_get_clientdata(client);
  1088. GYRO_LOG();
  1089. if (msg.event == PM_EVENT_SUSPEND) {
  1090. if (obj == NULL) {
  1091. GYRO_ERR("null pointer!!\n");
  1092. return -EINVAL;
  1093. }
  1094. atomic_set(&obj->suspend, 1);
  1095. err = ITG1010_SetPowerMode(client, false);
  1096. if (err <= 0)
  1097. return err;
  1098. #if INV_GYRO_AUTO_CALI == 1
  1099. inv_gyro_power_state = sensor_power;
  1100. /* inv_gyro_power_state = 0; */
  1101. /* put this in where gyro power is changed, waking up mpu daemon */
  1102. sysfs_notify(&inv_daemon_device->kobj, NULL, "inv_gyro_power_state");
  1103. #endif
  1104. }
  1105. return err;
  1106. }
  1107. /*----------------------------------------------------------------------------*/
  1108. static int ITG1010_resume(struct i2c_client *client)
  1109. {
  1110. struct ITG1010_i2c_data *obj = i2c_get_clientdata(client);
  1111. int err;
  1112. GYRO_LOG();
  1113. if (obj == NULL) {
  1114. GYRO_ERR("null pointer!!\n");
  1115. return -EINVAL;
  1116. }
  1117. ITG1010_power(obj->hw, 1);
  1118. err = ITG1010_init_client(client, false);
  1119. if (err) {
  1120. GYRO_ERR("initialize client fail!!\n");
  1121. return err;
  1122. }
  1123. atomic_set(&obj->suspend, 0);
  1124. return 0;
  1125. }
  1126. /*----------------------------------------------------------------------------*/
  1127. /*----------------------------------------------------------------------------*/
  1128. static int ITG1010_i2c_detect(struct i2c_client *client, struct i2c_board_info *info)
  1129. {
  1130. strcpy(info->type, ITG1010_DEV_NAME);
  1131. return 0;
  1132. }
  1133. /* if use this typ of enable , Gsensor should report inputEvent(x, y, z ,stats, div) to HAL */
  1134. static int ITG1010_open_report_data(int open)
  1135. {
  1136. /* should queuq work to report event if is_report_input_direct=true */
  1137. return 0;
  1138. }
  1139. /* if use this typ of enable , Gsensor only enabled but not report inputEvent to HAL */
  1140. static int ITG1010_enable_nodata(int en)
  1141. {
  1142. int res = 0;
  1143. int retry = 0;
  1144. bool power = false;
  1145. if (1 == en)
  1146. power = true;
  1147. if (0 == en)
  1148. power = false;
  1149. for (retry = 0; retry < 3; retry++) {
  1150. res = ITG1010_SetPowerMode(obj_i2c_data->client, power);
  1151. if (res == 0) {
  1152. GYRO_LOG("ITG1010_SetPowerMode done\n");
  1153. break;
  1154. }
  1155. GYRO_LOG("ITG1010_SetPowerMode fail\n");
  1156. }
  1157. if (res != ITG1010_SUCCESS) {
  1158. GYRO_LOG("ITG1010_SetPowerMode fail!\n");
  1159. return -1;
  1160. }
  1161. GYRO_LOG("ITG1010_enable_nodata OK!\n");
  1162. return 0;
  1163. }
  1164. static int ITG1010_set_delay(u64 ns)
  1165. {
  1166. return 0;
  1167. }
  1168. static int ITG1010_get_data(int *x , int *y, int *z, int *status)
  1169. {
  1170. char buff[ITG1010_BUFSIZE];
  1171. int ret = 0;
  1172. ITG1010_ReadGyroData(obj_i2c_data->client, buff, ITG1010_BUFSIZE);
  1173. ret = sscanf(buff, "%x %x %x", x, y, z);
  1174. *status = SENSOR_STATUS_ACCURACY_MEDIUM;
  1175. return 0;
  1176. }
  1177. /*----------------------------------------------------------------------------*/
  1178. static int ITG1010_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
  1179. {
  1180. struct i2c_client *new_client;
  1181. struct ITG1010_i2c_data *obj;
  1182. struct gyro_control_path ctl = {0};
  1183. struct gyro_data_path data = {0};
  1184. int i;
  1185. int err = 0;
  1186. int result;
  1187. GYRO_LOG();
  1188. obj = kzalloc(sizeof(*obj), GFP_KERNEL);
  1189. if (!obj) {
  1190. err = -ENOMEM;
  1191. goto exit;
  1192. }
  1193. memset(obj, 0, sizeof(struct ITG1010_i2c_data));
  1194. obj->hw = hw;
  1195. err = hwmsen_get_convert(obj->hw->direction, &obj->cvt);
  1196. if (err) {
  1197. GYRO_ERR("invalid direction: %d\n", obj->hw->direction);
  1198. goto exit;
  1199. }
  1200. if (0 != obj->hw->addr) {
  1201. client->addr = obj->hw->addr >> 1;
  1202. GYRO_LOG("gyro_use_i2c_addr: %x\n", client->addr);
  1203. }
  1204. obj_i2c_data = obj;
  1205. obj->client = client;
  1206. new_client = obj->client;
  1207. i2c_set_clientdata(new_client, obj);
  1208. atomic_set(&obj->trace, 0);
  1209. atomic_set(&obj->suspend, 0);
  1210. ITG1010_i2c_client = new_client;
  1211. err = ITG1010_init_client(new_client, false);
  1212. if (err)
  1213. goto exit_init_failed;
  1214. err = misc_register(&ITG1010_device);
  1215. if (err) {
  1216. GYRO_ERR("ITG1010_device misc register failed!\n");
  1217. goto exit_misc_device_register_failed;
  1218. }
  1219. ctl.is_use_common_factory = false;
  1220. err = ITG1010_create_attr(&(ITG1010_init_info.platform_diver_addr->driver));
  1221. if (err) {
  1222. GYRO_ERR("ITG1010 create attribute err = %d\n", err);
  1223. goto exit_create_attr_failed;
  1224. }
  1225. ctl.open_report_data = ITG1010_open_report_data;
  1226. ctl.enable_nodata = ITG1010_enable_nodata;
  1227. ctl.set_delay = ITG1010_set_delay;
  1228. ctl.is_report_input_direct = false;
  1229. ctl.is_support_batch = obj->hw->is_batch_supported;
  1230. err = gyro_register_control_path(&ctl);
  1231. if (err) {
  1232. GYRO_ERR("register gyro control path err\n");
  1233. goto exit_kfree;
  1234. }
  1235. data.get_data = ITG1010_get_data;
  1236. data.vender_div = DEGREE_TO_RAD;
  1237. err = gyro_register_data_path(&data);
  1238. if (err) {
  1239. GYRO_ERR("gyro_register_data_path fail = %d\n", err);
  1240. goto exit_kfree;
  1241. }
  1242. #if INV_GYRO_AUTO_CALI == 1
  1243. mutex_init(&obj->temperature_mutex);
  1244. mutex_init(&obj->raw_data_mutex);
  1245. /* create a class to avoid event drop by uevent_ops->filter function (dev_uevent_filter()) */
  1246. inv_daemon_class = class_create(THIS_MODULE, INV_DAEMON_CLASS_NAME);
  1247. if (IS_ERR(inv_daemon_class)) {
  1248. GYRO_ERR("cannot create inv daemon class, %s\n", INV_DAEMON_CLASS_NAME);
  1249. goto exit_class_create_failed;
  1250. }
  1251. inv_daemon_device = kzalloc(sizeof(struct device), GFP_KERNEL);
  1252. if (!inv_daemon_device) {
  1253. GYRO_ERR("cannot allocate inv daemon device, %s\n", INV_DAEMON_DEVICE_NAME);
  1254. goto exit_device_register_failed;
  1255. }
  1256. inv_daemon_device->init_name = INV_DAEMON_DEVICE_NAME;
  1257. inv_daemon_device->class = inv_daemon_class;
  1258. inv_daemon_device->release = (void (*)(struct device *))kfree;
  1259. result = device_register(inv_daemon_device);
  1260. if (result) {
  1261. GYRO_ERR("cannot register inv daemon device, %s\n", INV_DAEMON_DEVICE_NAME);
  1262. goto exit_device_register_failed;
  1263. }
  1264. result = 0;
  1265. for (i = 0; i < ARRAY_SIZE(inv_daemon_dev_attributes); i++) {
  1266. result = device_create_file(inv_daemon_device, inv_daemon_dev_attributes[i]);
  1267. if (result)
  1268. break;
  1269. }
  1270. if (result) {
  1271. while (--i >= 0)
  1272. device_remove_file(inv_daemon_device, inv_daemon_dev_attributes[i]);
  1273. GYRO_ERR("cannot create inv daemon dev attr.\n");
  1274. goto exit_create_file_failed;
  1275. }
  1276. #endif
  1277. ITG1010_init_flag = 0;
  1278. GYRO_LOG("%s: OK\n", __func__);
  1279. return 0;
  1280. #if INV_GYRO_AUTO_CALI == 1
  1281. exit_create_file_failed:
  1282. device_unregister(inv_daemon_device);
  1283. exit_device_register_failed:
  1284. class_destroy(inv_daemon_class);
  1285. exit_class_create_failed:
  1286. hwmsen_detach(ID_GYROSCOPE);
  1287. #endif
  1288. exit_create_attr_failed:
  1289. misc_deregister(&ITG1010_device);
  1290. exit_misc_device_register_failed:
  1291. exit_init_failed:
  1292. exit_kfree:
  1293. exit:
  1294. kfree(obj);
  1295. obj = NULL;
  1296. ITG1010_init_flag = -1;
  1297. GYRO_ERR("%s: err = %d\n", __func__, err);
  1298. return err;
  1299. }
  1300. /*----------------------------------------------------------------------------*/
  1301. static int ITG1010_i2c_remove(struct i2c_client *client)
  1302. {
  1303. int err = 0;
  1304. #if INV_GYRO_AUTO_CALI == 1
  1305. int i;
  1306. for (i = 0; i < ARRAY_SIZE(inv_daemon_dev_attributes); i++)
  1307. device_remove_file(inv_daemon_device, inv_daemon_dev_attributes[i]);
  1308. device_unregister(inv_daemon_device);
  1309. class_destroy(inv_daemon_class);
  1310. #endif
  1311. err = ITG1010_delete_attr(&(ITG1010_init_info.platform_diver_addr->driver));
  1312. if (err)
  1313. GYRO_ERR("ITG1010_delete_attr fail: %d\n", err);
  1314. err = misc_deregister(&ITG1010_device);
  1315. if (err)
  1316. GYRO_ERR("misc_deregister fail: %d\n", err);
  1317. ITG1010_i2c_client = NULL;
  1318. i2c_unregister_device(client);
  1319. kfree(i2c_get_clientdata(client));
  1320. return 0;
  1321. }
  1322. /*----------------------------------------------------------------------------*/
  1323. /*----------------------------------------------------------------------------*/
  1324. static int ITG1010_remove(void)
  1325. {
  1326. GYRO_LOG();
  1327. ITG1010_power(hw, 0);
  1328. i2c_del_driver(&ITG1010_i2c_driver);
  1329. return 0;
  1330. }
  1331. /*----------------------------------------------------------------------------*/
  1332. static int ITG1010_local_init(struct platform_device *pdev)
  1333. {
  1334. /* printk("fwq loccal init+++\n"); */
  1335. gyroPltFmDev = pdev;
  1336. ITG1010_power(hw, 1);
  1337. if (i2c_add_driver(&ITG1010_i2c_driver)) {
  1338. GYRO_ERR("add driver error\n");
  1339. return -1;
  1340. }
  1341. if (-1 == ITG1010_init_flag)
  1342. return -1;
  1343. return 0;
  1344. }
  1345. /*----------------------------------------------------------------------------*/
  1346. static int __init ITG1010_init(void)
  1347. {
  1348. const char *name = "mediatek,itg1010";
  1349. hw = get_gyro_dts_func(name, hw);
  1350. if (!hw)
  1351. GYRO_ERR("get dts info fail\n");
  1352. gyro_driver_add(&ITG1010_init_info);
  1353. return 0;
  1354. }
  1355. /*----------------------------------------------------------------------------*/
  1356. static void __exit ITG1010_exit(void)
  1357. {
  1358. GYRO_LOG();
  1359. }
  1360. /*----------------------------------------------------------------------------*/
  1361. module_init(ITG1010_init);
  1362. module_exit(ITG1010_exit);
  1363. /*----------------------------------------------------------------------------*/
  1364. MODULE_LICENSE("GPL");
  1365. MODULE_DESCRIPTION("ITG1010 gyroscope driver");