i2c.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:13k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*!***************************************************************************
  2. *!
  3. *! FILE NAME  : i2c.c
  4. *!
  5. *! DESCRIPTION: implements an interface for IIC/I2C, both directly from other
  6. *!              kernel modules (i2c_writereg/readreg) and from userspace using
  7. *!              ioctl()'s
  8. *!
  9. *! Nov 30 1998  Torbjorn Eliasson  Initial version.
  10. *!              Bjorn Wesen        Elinux kernel version.
  11. *! Jan 14 2000  Johan Adolfsson    Fixed PB shadow register stuff - 
  12. *!                                 don't use PB_I2C if DS1302 uses same bits,
  13. *!                                 use PB.
  14. *! $Log: i2c.c,v $
  15. *! Revision 1.8  2002/08/13 06:31:53  starvik
  16. *! Made SDA and SCL line configurable
  17. *! Modified i2c_inbyte to work with PCF8563
  18. *!
  19. *! Revision 1.7  2001/04/04 13:11:36  markusl
  20. *! Updated according to review remarks
  21. *!
  22. *! Revision 1.6  2001/03/19 12:43:00  markusl
  23. *! Made some symbols unstatic (used by the eeprom driver)
  24. *!
  25. *! Revision 1.5  2001/02/27 13:52:48  bjornw
  26. *! malloc.h -> slab.h
  27. *!
  28. *! Revision 1.4  2001/02/15 07:17:40  starvik
  29. *! Corrected usage if port_pb_i2c_shadow
  30. *!
  31. *! Revision 1.3  2001/01/26 17:55:13  bjornw
  32. *! * Made I2C_USES_PB_NOT_PB_I2C a CONFIG option instead of assigning it
  33. *!   magically. Config.in needs to set it for the options that need it, like
  34. *!   Dallas 1302 support. Actually, it should be default since it screws up
  35. *!   the PB bits even if you don't use I2C..
  36. *! * Include linux/config.h to get the above
  37. *!
  38. *! Revision 1.2  2001/01/18 15:49:30  bjornw
  39. *! 2.4 port of I2C including some cleanups (untested of course)
  40. *!
  41. *! Revision 1.1  2001/01/18 15:35:25  bjornw
  42. *! Verbatim copy of the Etrax i2c driver, 2.0 elinux version
  43. *!
  44. *!
  45. *! ---------------------------------------------------------------------------
  46. *!
  47. *! (C) Copyright 1999-2002 Axis Communications AB, LUND, SWEDEN
  48. *!
  49. *!***************************************************************************/
  50. /* $Id: i2c.c,v 1.8 2002/08/13 06:31:53 starvik Exp $ */
  51. /****************** INCLUDE FILES SECTION ***********************************/
  52. #include <linux/module.h>
  53. #include <linux/sched.h>
  54. #include <linux/slab.h>
  55. #include <linux/errno.h>
  56. #include <linux/kernel.h>
  57. #include <linux/fs.h>
  58. #include <linux/string.h>
  59. #include <linux/init.h>
  60. #include <linux/config.h>
  61. #include <asm/etraxi2c.h>
  62. #include <asm/system.h>
  63. #include <asm/svinto.h>
  64. #include <asm/io.h>
  65. #include <asm/delay.h>
  66. #include "i2c.h"
  67. /****************** I2C DEFINITION SECTION *************************/
  68. #define D(x)
  69. #define I2C_MAJOR 123  /* LOCAL/EXPERIMENTAL */
  70. static const char i2c_name[] = "i2c";
  71. #define CLOCK_LOW_TIME            8
  72. #define CLOCK_HIGH_TIME           8
  73. #define START_CONDITION_HOLD_TIME 8
  74. #define STOP_CONDITION_HOLD_TIME  8
  75. #define ENABLE_OUTPUT 0x01
  76. #define ENABLE_INPUT 0x00
  77. #define I2C_CLOCK_HIGH 1
  78. #define I2C_CLOCK_LOW 0
  79. #define I2C_DATA_HIGH 1
  80. #define I2C_DATA_LOW 0
  81. #if 0
  82. /* TODO: fix this so the CONFIG_ETRAX_I2C_USES... is set in Config.in instead */
  83. #if defined(CONFIG_DS1302) && (CONFIG_DS1302_SDABIT==0) && 
  84.            (CONFIG_DS1302_SCLBIT == 1)
  85. #define CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C
  86. #endif
  87. #endif
  88. #ifdef CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C
  89. /* Use PB and not PB_I2C */
  90. #ifndef CONFIG_ETRAX_I2C_DATA_PORT
  91. #define CONFIG_ETRAX_I2C_DATA_PORT 0
  92. #endif
  93. #ifndef CONFIG_ETRAX_I2C_CLK_PORT
  94. #define CONFIG_ETRAX_I2C_CLK_PORT 1
  95. #endif
  96. #define SDABIT CONFIG_ETRAX_I2C_DATA_PORT
  97. #define SCLBIT CONFIG_ETRAX_I2C_CLK_PORT
  98. #define i2c_enable() 
  99. #define i2c_disable() 
  100. /* enable or disable output-enable, to select output or input on the i2c bus */
  101. #define i2c_dir_out() 
  102.   REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, SDABIT, 1)
  103. #define i2c_dir_in()  
  104.   REG_SHADOW_SET(R_PORT_PB_DIR, port_pb_dir_shadow, SDABIT, 0)
  105. /* control the i2c clock and data signals */
  106. #define i2c_clk(x) 
  107.   REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, SCLBIT, x)
  108. #define i2c_data(x) 
  109.   REG_SHADOW_SET(R_PORT_PB_DATA, port_pb_data_shadow, SDABIT, x)
  110. /* read a bit from the i2c interface */
  111. #define i2c_getbit() (((*R_PORT_PB_READ & (1 << SDABIT))) >> SDABIT)
  112. #else
  113. /* enable or disable the i2c interface */
  114. #define i2c_enable() *R_PORT_PB_I2C = (port_pb_i2c_shadow |= IO_MASK(R_PORT_PB_I2C, i2c_en))
  115. #define i2c_disable() *R_PORT_PB_I2C = (port_pb_i2c_shadow &= ~IO_MASK(R_PORT_PB_I2C, i2c_en))
  116. /* enable or disable output-enable, to select output or input on the i2c bus */
  117. #define i2c_dir_out() *R_PORT_PB_I2C = (port_pb_i2c_shadow &= ~IO_MASK(R_PORT_PB_I2C, i2c_oe_))
  118. #define i2c_dir_in() *R_PORT_PB_I2C = (port_pb_i2c_shadow |= IO_MASK(R_PORT_PB_I2C, i2c_oe_))
  119. /* control the i2c clock and data signals */
  120. #define i2c_clk(x) *R_PORT_PB_I2C = (port_pb_i2c_shadow = (port_pb_i2c_shadow & 
  121.        ~IO_MASK(R_PORT_PB_I2C, i2c_clk)) | IO_FIELD(R_PORT_PB_I2C, i2c_clk, (x)))
  122. #define i2c_data(x) *R_PORT_PB_I2C = (port_pb_i2c_shadow = (port_pb_i2c_shadow & 
  123.        ~IO_MASK(R_PORT_PB_I2C, i2c_d)) | IO_FIELD(R_PORT_PB_I2C, i2c_d, (x)))
  124. /* read a bit from the i2c interface */
  125. #define i2c_getbit() (*R_PORT_PB_READ & 0x1)
  126. #endif
  127. /* use the kernels delay routine */
  128. #define i2c_delay(usecs) udelay(usecs)
  129. /****************** FUNCTION DEFINITION SECTION *************************/
  130. /* generate i2c start condition */
  131. void
  132. i2c_start(void)
  133. {
  134. /*
  135.  * SCL=1 SDA=1
  136.  */
  137. i2c_dir_out();
  138. i2c_delay(CLOCK_HIGH_TIME/6);
  139. i2c_data(I2C_DATA_HIGH);
  140. i2c_clk(I2C_CLOCK_HIGH);
  141. i2c_delay(CLOCK_HIGH_TIME);
  142. /*
  143.  * SCL=1 SDA=0
  144.  */
  145. i2c_data(I2C_DATA_LOW);
  146. i2c_delay(START_CONDITION_HOLD_TIME);
  147. /*
  148.  * SCL=0 SDA=0
  149.  */
  150. i2c_clk(I2C_CLOCK_LOW);
  151. i2c_delay(CLOCK_LOW_TIME);
  152. }
  153. /* generate i2c stop condition */
  154. void
  155. i2c_stop(void)
  156. {
  157. i2c_dir_out();
  158. /*
  159.  * SCL=0 SDA=0
  160.  */
  161. i2c_clk(I2C_CLOCK_LOW);
  162. i2c_data(I2C_DATA_LOW);
  163. i2c_delay(CLOCK_LOW_TIME*2);
  164. /*
  165.  * SCL=1 SDA=0
  166.  */
  167. i2c_clk(I2C_CLOCK_HIGH);
  168. i2c_delay(CLOCK_HIGH_TIME*2);
  169. /*
  170.  * SCL=1 SDA=1
  171.  */
  172. i2c_data(I2C_DATA_HIGH);
  173. i2c_delay(STOP_CONDITION_HOLD_TIME);
  174. i2c_dir_in();
  175. }
  176. /* write a byte to the i2c interface */
  177. void
  178. i2c_outbyte(unsigned char x)
  179. {
  180. int i;
  181. i2c_dir_out();
  182. for (i = 0; i < 8; i++) {
  183. if (x & 0x80)
  184. i2c_data(I2C_DATA_HIGH);
  185. else
  186. i2c_data(I2C_DATA_LOW);
  187. i2c_delay(CLOCK_LOW_TIME/2);
  188. i2c_clk(I2C_CLOCK_HIGH);
  189. i2c_delay(CLOCK_HIGH_TIME);
  190. i2c_clk(I2C_CLOCK_LOW);
  191. i2c_delay(CLOCK_LOW_TIME/2);
  192. x <<= 1;
  193. }
  194. i2c_data(I2C_DATA_LOW);
  195. i2c_delay(CLOCK_LOW_TIME/2);
  196. /*
  197.  * enable input
  198.  */
  199. i2c_dir_in();
  200. }
  201. /* read a byte from the i2c interface */
  202. unsigned char
  203. i2c_inbyte(void)
  204. {
  205. unsigned char aBitByte = 0;
  206. int i;
  207. /* Switch off I2C to get bit */
  208. i2c_disable();
  209. i2c_dir_in();
  210. i2c_delay(CLOCK_HIGH_TIME/2);
  211. /* Get bit */
  212. aBitByte |= i2c_getbit();
  213. /* Enable I2C */
  214. i2c_enable();
  215. i2c_dir_out();
  216. i2c_delay(CLOCK_LOW_TIME/2);
  217. for (i = 1; i < 8; i++) {
  218. aBitByte <<= 1;
  219. /* Clock pulse */
  220. i2c_clk(I2C_CLOCK_HIGH);
  221. i2c_delay(CLOCK_HIGH_TIME);
  222. i2c_clk(I2C_CLOCK_LOW);
  223. i2c_delay(CLOCK_LOW_TIME);
  224. /* Switch off I2C to get bit */
  225. i2c_disable();
  226. i2c_dir_in();
  227. i2c_delay(CLOCK_HIGH_TIME/2);
  228. /* Get bit */
  229. aBitByte |= i2c_getbit();
  230. /* Enable I2C */
  231. i2c_enable();
  232. i2c_dir_out();
  233. i2c_delay(CLOCK_LOW_TIME/2);
  234. }
  235. i2c_clk(I2C_CLOCK_HIGH);
  236. i2c_delay(CLOCK_HIGH_TIME);
  237. i2c_clk(I2C_CLOCK_LOW);
  238. return aBitByte;
  239. }
  240. /*#---------------------------------------------------------------------------
  241. *#
  242. *# FUNCTION NAME: i2c_getack
  243. *#
  244. *# DESCRIPTION  : checks if ack was received from ic2
  245. *#
  246. *#--------------------------------------------------------------------------*/
  247. int
  248. i2c_getack(void)
  249. {
  250. int ack = 1;
  251. /*
  252.  * enable output
  253.  */
  254. i2c_dir_out();
  255. /*
  256.  * Release data bus by setting
  257.  * data high
  258.  */
  259. i2c_data(I2C_DATA_HIGH);
  260. /*
  261.  * enable input
  262.  */
  263. i2c_dir_in();
  264. i2c_delay(CLOCK_HIGH_TIME/4);
  265. /*
  266.  * generate ACK clock pulse
  267.  */
  268. i2c_clk(I2C_CLOCK_HIGH);
  269. /*
  270.  * Use PORT PB instead of I2C
  271.  * for input. (I2C not working)
  272.  */
  273. i2c_clk(1);
  274. i2c_data(1);
  275. /*
  276.  * switch off I2C
  277.  */
  278. i2c_data(1);
  279. i2c_disable();
  280. i2c_dir_in();
  281. /*
  282.  * now wait for ack
  283.  */
  284. i2c_delay(CLOCK_HIGH_TIME/2);
  285. /*
  286.  * check for ack
  287.  */
  288. if(i2c_getbit())
  289. ack = 0;
  290. i2c_delay(CLOCK_HIGH_TIME/2);
  291. if(!ack){
  292. if(!i2c_getbit()) /* receiver pulld SDA low */
  293. ack = 1;
  294. i2c_delay(CLOCK_HIGH_TIME/2);
  295. }
  296. /*
  297.  * end clock pulse
  298.  */
  299. i2c_enable();
  300. i2c_dir_out();
  301. i2c_clk(I2C_CLOCK_LOW);
  302. i2c_delay(CLOCK_HIGH_TIME/4);
  303. /*
  304.  * enable output
  305.  */
  306. i2c_dir_out();
  307. /*
  308.  * remove ACK clock pulse
  309.  */
  310. i2c_data(I2C_DATA_HIGH);
  311. i2c_delay(CLOCK_LOW_TIME/2);
  312. return ack;
  313. }
  314. /*#---------------------------------------------------------------------------
  315. *#
  316. *# FUNCTION NAME: I2C::sendAck
  317. *#
  318. *# DESCRIPTION  : Send ACK on received data
  319. *#
  320. *#--------------------------------------------------------------------------*/
  321. void
  322. i2c_sendack(void)
  323. {
  324. /*
  325.  * enable output
  326.  */
  327. i2c_delay(CLOCK_LOW_TIME);
  328. i2c_dir_out();
  329. /*
  330.  * set ack pulse high
  331.  */
  332. i2c_data(I2C_DATA_LOW);
  333. /*
  334.  * generate clock pulse
  335.  */
  336. i2c_delay(CLOCK_HIGH_TIME/6);
  337. i2c_clk(I2C_CLOCK_HIGH);
  338. i2c_delay(CLOCK_HIGH_TIME);
  339. i2c_clk(I2C_CLOCK_LOW);
  340. i2c_delay(CLOCK_LOW_TIME/6);
  341. /*
  342.  * reset data out
  343.  */
  344. i2c_data(I2C_DATA_HIGH);
  345. i2c_delay(CLOCK_LOW_TIME);
  346. i2c_dir_in();
  347. }
  348. /*#---------------------------------------------------------------------------
  349. *#
  350. *# FUNCTION NAME: i2c_writereg
  351. *#
  352. *# DESCRIPTION  : Writes a value to an I2C device
  353. *#
  354. *#--------------------------------------------------------------------------*/
  355. int
  356. i2c_writereg(unsigned char theSlave, unsigned char theReg, 
  357.      unsigned char theValue)
  358. {
  359. int error, cntr = 3;
  360. unsigned long flags;
  361. do {
  362. error = 0;
  363. /*
  364.  * we don't like to be interrupted
  365.  */
  366. save_flags(flags);
  367. cli();
  368. i2c_start();
  369. /*
  370.  * send slave address
  371.  */
  372. i2c_outbyte((theSlave & 0xfe));
  373. /*
  374.  * wait for ack
  375.  */
  376. if(!i2c_getack())
  377. error = 1;
  378. /*
  379.  * now select register
  380.  */
  381. i2c_dir_out();
  382. i2c_outbyte(theReg);
  383. /*
  384.  * now it's time to wait for ack
  385.  */
  386. if(!i2c_getack())
  387. error |= 2;
  388. /*
  389.  * send register register data
  390.  */
  391. i2c_outbyte(theValue);
  392. /*
  393.  * now it's time to wait for ack
  394.  */
  395. if(!i2c_getack())
  396. error |= 4;
  397. /*
  398.  * end byte stream
  399.  */
  400. i2c_stop();
  401. /*
  402.  * enable interrupt again
  403.  */
  404. restore_flags(flags);
  405. } while(error && cntr--);
  406. i2c_delay(CLOCK_LOW_TIME);
  407. return -error;
  408. }
  409. /*#---------------------------------------------------------------------------
  410. *#
  411. *# FUNCTION NAME: i2c_readreg
  412. *#
  413. *# DESCRIPTION  : Reads a value from the decoder registers.
  414. *#
  415. *#--------------------------------------------------------------------------*/
  416. unsigned char
  417. i2c_readreg(unsigned char theSlave, unsigned char theReg)
  418. {
  419. unsigned char b = 0;
  420. int error, cntr = 3;
  421. unsigned long flags;
  422. do {
  423. error = 0;
  424. /*
  425.  * we don't like to be interrupted
  426.  */
  427. save_flags(flags);
  428. cli();
  429. /*
  430.  * generate start condition
  431.  */
  432. i2c_start();
  433.     
  434. /*
  435.  * send slave address
  436.  */
  437. i2c_outbyte((theSlave & 0xfe));
  438. /*
  439.  * wait for ack
  440.  */
  441. if(!i2c_getack())
  442. error = 1;
  443. /*
  444.  * now select register
  445.  */
  446. i2c_dir_out();
  447. i2c_outbyte(theReg);
  448. /*
  449.  * now it's time to wait for ack
  450.  */
  451. if(!i2c_getack())
  452. error = 1;
  453. /*
  454.  * repeat start condition
  455.  */
  456. i2c_delay(CLOCK_LOW_TIME);
  457. i2c_start();
  458. /*
  459.  * send slave address
  460.  */
  461. i2c_outbyte(theSlave | 0x01);
  462. /*
  463.  * wait for ack
  464.  */
  465. if(!i2c_getack())
  466. error = 1;
  467. /*
  468.  * fetch register
  469.  */
  470. b = i2c_inbyte();
  471. /*
  472.  * send Ack
  473.  */
  474. i2c_sendack();
  475. /*
  476.  * end sequence
  477.  */
  478. i2c_stop();
  479. /*
  480.  * enable interrupt again
  481.  */
  482. restore_flags(flags);
  483. } while(error && cntr--);
  484. return b;
  485. }
  486. static int
  487. i2c_open(struct inode *inode, struct file *filp)
  488. {
  489. return 0;
  490. }
  491. static int
  492. i2c_release(struct inode *inode, struct file *filp)
  493. {
  494. return 0;
  495. }
  496. /* Main device API. ioctl's to write or read to/from i2c registers.
  497.  */
  498. static int
  499. i2c_ioctl(struct inode *inode, struct file *file,
  500.   unsigned int cmd, unsigned long arg)
  501. {
  502. if(_IOC_TYPE(cmd) != ETRAXI2C_IOCTYPE) {
  503. return -EINVAL;
  504. }
  505. switch (_IOC_NR(cmd)) {
  506. case I2C_WRITEREG:
  507. /* write to an i2c slave */
  508. D(printk("i2cw %d %d %dn", 
  509.  I2C_ARGSLAVE(arg),
  510.  I2C_ARGREG(arg),
  511.  I2C_ARGVALUE(arg)));
  512. return i2c_writereg(I2C_ARGSLAVE(arg),
  513.     I2C_ARGREG(arg),
  514.     I2C_ARGVALUE(arg));
  515. case I2C_READREG:
  516. {
  517. unsigned char val;
  518. /* read from an i2c slave */
  519. D(printk("i2cr %d %d ", 
  520. I2C_ARGSLAVE(arg),
  521. I2C_ARGREG(arg)));
  522. val = i2c_readreg(I2C_ARGSLAVE(arg), I2C_ARGREG(arg));
  523. D(printk("= %dn", val));
  524. return val;
  525. }     
  526. default:
  527. return -EINVAL;
  528. }
  529. return 0;
  530. }
  531. static struct file_operations i2c_fops = {
  532. owner:    THIS_MODULE,
  533. ioctl:    i2c_ioctl,
  534. open:     i2c_open,
  535. release:  i2c_release,
  536. };
  537. static int __init
  538. i2c_init(void)
  539. {
  540. int res;
  541. /* Setup and enable the Port B I2C interface */
  542. #ifndef CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C
  543. *R_PORT_PB_I2C = port_pb_i2c_shadow |= 
  544. IO_STATE(R_PORT_PB_I2C, i2c_en,  on) |
  545. IO_FIELD(R_PORT_PB_I2C, i2c_d,   1)  |
  546. IO_FIELD(R_PORT_PB_I2C, i2c_clk, 1)  |
  547. IO_STATE(R_PORT_PB_I2C, i2c_oe_, enable);
  548. #endif
  549. port_pb_dir_shadow &= ~IO_MASK(R_PORT_PB_DIR, dir0);
  550. port_pb_dir_shadow &= ~IO_MASK(R_PORT_PB_DIR, dir1);
  551. *R_PORT_PB_DIR = (port_pb_dir_shadow |=
  552.   IO_STATE(R_PORT_PB_DIR, dir0, input)  |
  553.   IO_STATE(R_PORT_PB_DIR, dir1, output));
  554. /* register char device */
  555. res = register_chrdev(I2C_MAJOR, i2c_name, &i2c_fops);
  556. if(res < 0) {
  557. printk(KERN_ERR "i2c: couldn't get a major number.n");
  558. return res;
  559. }
  560. printk("I2C driver v2.2, (c) 1999-2001 Axis Communications ABn");
  561. return 0;
  562. }
  563. /* this makes sure that i2c_init is called during boot */
  564. module_init(i2c_init);
  565. /****************** END OF FILE i2c.c ********************************/