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

Linux/Unix编程

开发平台:

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