i2c.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:14k
源码类别:

嵌入式Linux

开发平台:

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