i2c.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:9k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.  * Generic i2c interface for linux
  3.  *
  4.  * (c) 1998 Gerd Knorr <kraxel@cs.tu-berlin.de>
  5.  *
  6.  */
  7. #include <linux/config.h>
  8. #include <linux/module.h>
  9. #include <linux/kernel.h>
  10. #include <linux/errno.h>
  11. #include <linux/types.h>
  12. #include <linux/string.h>
  13. #include <linux/delay.h>
  14. #include <linux/locks.h>
  15. #include <linux/sched.h>
  16. #include <linux/malloc.h>
  17. #include <linux/i2c.h>
  18. #define REGPRINT(x)   if (verbose)   (x)
  19. #define I2C_DEBUG(x)  if (i2c_debug) (x)
  20. static int scan      = 0;
  21. static int verbose   = 0;
  22. static int i2c_debug = 0;
  23. #if LINUX_VERSION_CODE >= 0x020117
  24. MODULE_PARM(scan,"i");
  25. MODULE_PARM(verbose,"i");
  26. MODULE_PARM(i2c_debug,"i");
  27. #endif
  28. /* ----------------------------------------------------------------------- */
  29. static struct i2c_bus    *busses[I2C_BUS_MAX];
  30. static struct i2c_driver *drivers[I2C_DRIVER_MAX];
  31. static int bus_count = 0, driver_count = 0;
  32. #ifdef CONFIG_VIDEO_BT848
  33. extern int i2c_tuner_init(void);
  34. extern int msp3400c_init(void);
  35. #endif
  36. #ifdef CONFIG_VIDEO_MGA
  37. extern int ks0127_init(void);
  38. #endif
  39. int i2c_init(void)
  40. {
  41. printk(KERN_INFO "i2c: initialized%sn",
  42. scan ? " (i2c bus scan enabled)" : "");
  43. /* anything to do here ? */
  44. #ifdef CONFIG_VIDEO_BT848
  45. i2c_tuner_init();
  46. msp3400c_init();
  47. #endif
  48. #ifdef CONFIG_VIDEO_MGA
  49.         ks0127_init();
  50. #endif
  51. return 0;
  52. }
  53. /* ----------------------------------------------------------------------- */
  54. static void i2c_attach_device(struct i2c_bus *bus, struct i2c_driver *driver)
  55. {
  56. struct i2c_device *device;
  57. int i,j,ack=1;
  58. unsigned char addr;
  59. LOCK_FLAGS;
  60.     
  61. /* probe for device */
  62. LOCK_I2C_BUS(bus);
  63. for (addr = driver->addr_l; addr <= driver->addr_h; addr += 2) 
  64. {
  65. i2c_start(bus);
  66. ack = i2c_sendbyte(bus,addr,0);
  67. i2c_stop(bus);
  68. if (!ack)
  69. break;
  70. }
  71. UNLOCK_I2C_BUS(bus);
  72. if (ack)
  73. return;
  74. /* got answer */
  75. for (i = 0; i < I2C_DEVICE_MAX; i++)
  76. if (NULL == driver->devices[i])
  77. break;
  78. if (I2C_DEVICE_MAX == i)
  79. return;
  80. for (j = 0; j < I2C_DEVICE_MAX; j++)
  81. if (NULL == bus->devices[j])
  82. break;
  83. if (I2C_DEVICE_MAX == j)
  84. return;
  85. if (NULL == (device = kmalloc(sizeof(struct i2c_device),GFP_KERNEL)))
  86. return;
  87. device->bus = bus;
  88. device->driver = driver;
  89. device->addr = addr;
  90. /* Attach */
  91. if (driver->attach(device)!=0) 
  92. {
  93. kfree(device);
  94. return;
  95. }
  96. driver->devices[i] = device;
  97. driver->devcount++;
  98. bus->devices[j] = device;
  99. bus->devcount++;
  100. if (bus->attach_inform)
  101. bus->attach_inform(bus,driver->id);
  102. REGPRINT(printk("i2c: device attached: %s (addr=0x%02x, bus=%s, driver=%s)n",device->name,addr,bus->name,driver->name));
  103. }
  104. static void i2c_detach_device(struct i2c_device *device)
  105. {
  106. int i;
  107. if (device->bus->detach_inform)
  108. device->bus->detach_inform(device->bus,device->driver->id);
  109. device->driver->detach(device);
  110. for (i = 0; i < I2C_DEVICE_MAX; i++)
  111. if (device == device->driver->devices[i])
  112. break;
  113. if (I2C_DEVICE_MAX == i) 
  114. {
  115. printk(KERN_WARNING "i2c: detach_device #1: device not found: %sn",
  116. device->name);
  117. return;
  118. }
  119. device->driver->devices[i] = NULL;
  120. device->driver->devcount--;
  121. for (i = 0; i < I2C_DEVICE_MAX; i++)
  122. if (device == device->bus->devices[i])
  123. break;
  124. if (I2C_DEVICE_MAX == i) 
  125. {
  126. printk(KERN_WARNING "i2c: detach_device #2: device not found: %sn",
  127.        device->name);
  128. return;
  129. }
  130. device->bus->devices[i] = NULL;
  131. device->bus->devcount--;
  132. REGPRINT(printk("i2c: device detached: %s (addr=0x%02x, bus=%s, driver=%s)n",device->name,device->addr,device->bus->name,device->driver->name));
  133. kfree(device);
  134. }
  135. /* ----------------------------------------------------------------------- */
  136. int i2c_register_bus(struct i2c_bus *bus)
  137. {
  138. int i,ack;
  139. LOCK_FLAGS;
  140. memset(bus->devices,0,sizeof(bus->devices));
  141. bus->devcount = 0;
  142. for (i = 0; i < I2C_BUS_MAX; i++)
  143. if (NULL == busses[i])
  144. break;
  145. if (I2C_BUS_MAX == i)
  146. return -ENOMEM;
  147. busses[i] = bus;
  148. bus_count++;
  149. REGPRINT(printk("i2c: bus registered: %sn",bus->name));
  150. MOD_INC_USE_COUNT;
  151. if (scan) 
  152. {
  153. /* scan whole i2c bus */
  154. LOCK_I2C_BUS(bus);
  155. for (i = 0; i < 256; i+=2) 
  156. {
  157. i2c_start(bus);
  158. ack = i2c_sendbyte(bus,i,0);
  159. i2c_stop(bus);
  160. if (!ack) 
  161. {
  162. printk(KERN_INFO "i2c: scanning bus %s: found device at addr=0x%02xn",
  163. bus->name,i);
  164. }
  165. }
  166. UNLOCK_I2C_BUS(bus);
  167. }
  168. /* probe available drivers */
  169. for (i = 0; i < I2C_DRIVER_MAX; i++)
  170. if (drivers[i])
  171. i2c_attach_device(bus,drivers[i]);
  172. return 0;
  173. }
  174. int i2c_unregister_bus(struct i2c_bus *bus)
  175. {
  176. int i;
  177. /* detach devices */
  178. for (i = 0; i < I2C_DEVICE_MAX; i++)
  179. if (bus->devices[i])
  180. i2c_detach_device(bus->devices[i]);
  181. for (i = 0; i < I2C_BUS_MAX; i++)
  182. if (bus == busses[i])
  183. break;
  184. if (I2C_BUS_MAX == i) 
  185. {
  186. printk(KERN_WARNING "i2c: unregister_bus #1: bus not found: %sn",
  187. bus->name);
  188. return -ENODEV;
  189. }
  190. MOD_DEC_USE_COUNT;
  191. busses[i] = NULL;
  192. bus_count--;
  193. REGPRINT(printk("i2c: bus unregistered: %sn",bus->name));
  194. return 0;    
  195. }
  196. /* ----------------------------------------------------------------------- */
  197. int i2c_register_driver(struct i2c_driver *driver)
  198. {
  199. int i;
  200. memset(driver->devices,0,sizeof(driver->devices));
  201. driver->devcount = 0;
  202. for (i = 0; i < I2C_DRIVER_MAX; i++)
  203. if (NULL == drivers[i])
  204. break;
  205. if (I2C_DRIVER_MAX == i)
  206. return -ENOMEM;
  207. drivers[i] = driver;
  208. driver_count++;
  209. MOD_INC_USE_COUNT;
  210. REGPRINT(printk("i2c: driver registered: %sn",driver->name));
  211. /* Probe available busses */
  212. for (i = 0; i < I2C_BUS_MAX; i++)
  213. if (busses[i])
  214. i2c_attach_device(busses[i],driver);
  215. return 0;
  216. }
  217. int i2c_unregister_driver(struct i2c_driver *driver)
  218. {
  219. int i;
  220. /* detach devices */
  221. for (i = 0; i < I2C_DEVICE_MAX; i++)
  222. if (driver->devices[i])
  223. i2c_detach_device(driver->devices[i]);
  224. for (i = 0; i < I2C_DRIVER_MAX; i++)
  225. if (driver == drivers[i])
  226. break;
  227. if (I2C_DRIVER_MAX == i) 
  228. {
  229. printk(KERN_WARNING "i2c: unregister_driver: driver not found: %sn",
  230. driver->name);
  231. return -ENODEV;
  232. }
  233. MOD_DEC_USE_COUNT;
  234. drivers[i] = NULL;
  235. driver_count--;
  236. REGPRINT(printk("i2c: driver unregistered: %sn",driver->name));
  237. return 0;
  238. }
  239. /* ----------------------------------------------------------------------- */
  240. int i2c_control_device(struct i2c_bus *bus, int id,
  241.        unsigned int cmd, void *arg)
  242. {
  243. int i;
  244. for (i = 0; i < I2C_DEVICE_MAX; i++)
  245. if (bus->devices[i] && bus->devices[i]->driver->id == id)
  246. break;
  247. if (i == I2C_DEVICE_MAX)
  248. return -ENODEV;
  249. if (NULL == bus->devices[i]->driver->command)
  250. return -ENODEV;
  251. return bus->devices[i]->driver->command(bus->devices[i],cmd,arg);
  252. }
  253. /* ----------------------------------------------------------------------- */
  254. #define I2C_SET(bus,ctrl,data)  (bus->i2c_setlines(bus,ctrl,data))
  255. #define I2C_GET(bus)            (bus->i2c_getdataline(bus))
  256. void i2c_start(struct i2c_bus *bus)
  257. {
  258. I2C_SET(bus,0,1);
  259. I2C_SET(bus,1,1);
  260. I2C_SET(bus,1,0);
  261. I2C_SET(bus,0,0);
  262. I2C_DEBUG(printk("%s: < ",bus->name));
  263. }
  264. void i2c_stop(struct i2c_bus *bus)
  265. {
  266. I2C_SET(bus,0,0);
  267. I2C_SET(bus,1,0);
  268. I2C_SET(bus,1,1);
  269. I2C_DEBUG(printk(">n"));
  270. }
  271. void i2c_one(struct i2c_bus *bus)
  272. {
  273. I2C_SET(bus,0,1);
  274. I2C_SET(bus,1,1);
  275. I2C_SET(bus,0,1);
  276. }
  277. void i2c_zero(struct i2c_bus *bus)
  278. {
  279. I2C_SET(bus,0,0);
  280. I2C_SET(bus,1,0);
  281. I2C_SET(bus,0,0);
  282. }
  283. int i2c_ack(struct i2c_bus *bus)
  284. {
  285. int ack;
  286.     
  287. I2C_SET(bus,0,1);
  288. I2C_SET(bus,1,1);
  289. ack = I2C_GET(bus);
  290. I2C_SET(bus,0,1);
  291. return ack;
  292. }
  293. int i2c_sendbyte(struct i2c_bus *bus,unsigned char data,int wait_for_ack)
  294. {
  295. int i, ack;
  296.     
  297. I2C_SET(bus,0,0);
  298. for (i=7; i>=0; i--)
  299. (data&(1<<i)) ? i2c_one(bus) : i2c_zero(bus);
  300. if (wait_for_ack)
  301. udelay(wait_for_ack);
  302. ack=i2c_ack(bus);
  303. I2C_DEBUG(printk("%02x%c ",(int)data,ack?'-':'+'));
  304. return ack;
  305. }
  306. unsigned char i2c_readbyte(struct i2c_bus *bus,int last)
  307. {
  308. int i;
  309. unsigned char data=0;
  310.     
  311. I2C_SET(bus,0,1);
  312. for (i=7; i>=0; i--) 
  313. {
  314. I2C_SET(bus,1,1);
  315. if (I2C_GET(bus))
  316. data |= (1<<i);
  317. I2C_SET(bus,0,1);
  318. }
  319. last ? i2c_one(bus) : i2c_zero(bus);
  320. I2C_DEBUG(printk("=%02x%c ",(int)data,last?'-':'+'));
  321. return data;
  322. }
  323. /* ----------------------------------------------------------------------- */
  324. int i2c_read(struct i2c_bus *bus, unsigned char addr)
  325. {
  326. int ret;
  327.     
  328. if (bus->i2c_read)
  329. return bus->i2c_read(bus, addr);
  330. i2c_start(bus);
  331. i2c_sendbyte(bus,addr,0);
  332. ret = i2c_readbyte(bus,1);
  333. i2c_stop(bus);
  334. return ret;
  335. }
  336. int i2c_write(struct i2c_bus *bus, unsigned char addr,
  337.       unsigned char data1, unsigned char data2, int both)
  338. {
  339. int ack;
  340. if (bus->i2c_write)
  341. return bus->i2c_write(bus, addr, data1, data2, both);
  342. i2c_start(bus);
  343. i2c_sendbyte(bus,addr,0);
  344. ack = i2c_sendbyte(bus,data1,0);
  345. if (both)
  346. ack = i2c_sendbyte(bus,data2,0);
  347. i2c_stop(bus);
  348. return ack ? -1 : 0 ;
  349. }
  350. /* ----------------------------------------------------------------------- */
  351. #ifdef MODULE
  352. #if LINUX_VERSION_CODE >= 0x020100
  353. EXPORT_SYMBOL(i2c_register_bus);
  354. EXPORT_SYMBOL(i2c_unregister_bus);
  355. EXPORT_SYMBOL(i2c_register_driver);
  356. EXPORT_SYMBOL(i2c_unregister_driver);
  357. EXPORT_SYMBOL(i2c_control_device);
  358. EXPORT_SYMBOL(i2c_start);
  359. EXPORT_SYMBOL(i2c_stop);
  360. EXPORT_SYMBOL(i2c_one);
  361. EXPORT_SYMBOL(i2c_zero);
  362. EXPORT_SYMBOL(i2c_ack);
  363. EXPORT_SYMBOL(i2c_sendbyte);
  364. EXPORT_SYMBOL(i2c_readbyte);
  365. EXPORT_SYMBOL(i2c_read);
  366. EXPORT_SYMBOL(i2c_write);
  367. #endif
  368. int init_module(void)
  369. {
  370. return i2c_init();
  371. }
  372. void cleanup_module(void)
  373. {
  374. }
  375. #endif