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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* 
  2.  * Motion Eye video4linux driver for Sony Vaio PictureBook
  3.  *
  4.  * Copyright (C) 2001 Stelian Pop <stelian.pop@fr.alcove.com>, Alc魐e
  5.  *
  6.  * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com>
  7.  *
  8.  * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras.
  9.  *
  10.  * Some parts borrowed from various video4linux drivers, especially
  11.  * bttv-driver.c and zoran.c, see original files for credits.
  12.  * 
  13.  * This program is free software; you can redistribute it and/or modify
  14.  * it under the terms of the GNU General Public License as published by
  15.  * the Free Software Foundation; either version 2 of the License, or
  16.  * (at your option) any later version.
  17.  * 
  18.  * This program is distributed in the hope that it will be useful,
  19.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21.  * GNU General Public License for more details.
  22.  * 
  23.  * You should have received a copy of the GNU General Public License
  24.  * along with this program; if not, write to the Free Software
  25.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  26.  */
  27. #include <linux/config.h>
  28. #include <linux/module.h>
  29. #include <linux/pci.h>
  30. #include <linux/sched.h>
  31. #include <linux/init.h>
  32. #include <linux/videodev.h>
  33. #include <asm/uaccess.h>
  34. #include <asm/io.h>
  35. #include <linux/delay.h>
  36. #include <linux/wrapper.h>
  37. #include <linux/interrupt.h>
  38. #include <linux/vmalloc.h>
  39. #include "meye.h"
  40. #include "linux/meye.h"
  41. /* driver structure - only one possible */
  42. static struct meye meye;
  43. /* number of grab buffers */
  44. static unsigned int gbuffers = 2;
  45. /* size of a grab buffer */
  46. static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
  47. /* /dev/videoX registration number */
  48. static int video_nr = -1;
  49. /****************************************************************************/
  50. /* Queue routines                                                           */
  51. /****************************************************************************/
  52. /* Inits the queue */
  53. static inline void meye_initq(struct meye_queue *queue) {
  54. queue->head = queue->tail = 0;
  55. queue->len = 0;
  56. queue->s_lock = (spinlock_t)SPIN_LOCK_UNLOCKED;
  57. init_waitqueue_head(&queue->proc_list);
  58. }
  59. /* Pulls an element from the queue */
  60. static inline int meye_pullq(struct meye_queue *queue) {
  61. int result;
  62. unsigned long flags;
  63. spin_lock_irqsave(&queue->s_lock, flags);
  64. if (!queue->len) {
  65. spin_unlock_irqrestore(&queue->s_lock, flags);
  66. return -1;
  67. }
  68. result = queue->buf[queue->head];
  69. queue->head++;
  70. queue->head &= (MEYE_QUEUE_SIZE - 1);
  71. queue->len--;
  72. spin_unlock_irqrestore(&queue->s_lock, flags);
  73. return result;
  74. }
  75. /* Pushes an element into the queue */
  76. static inline void meye_pushq(struct meye_queue *queue, int element) {
  77. unsigned long flags;
  78. spin_lock_irqsave(&queue->s_lock, flags);
  79. if (queue->len == MEYE_QUEUE_SIZE) {
  80. /* remove the first element */
  81. queue->head++;
  82. queue->head &= (MEYE_QUEUE_SIZE - 1);
  83. queue->len--;
  84. }
  85. queue->buf[queue->tail] = element;
  86. queue->tail++;
  87. queue->tail &= (MEYE_QUEUE_SIZE - 1);
  88. queue->len++;
  89. spin_unlock_irqrestore(&queue->s_lock, flags);
  90. }
  91. /* Tests if the queue is empty */
  92. static inline int meye_emptyq(struct meye_queue *queue, int *elem) {
  93. int result;
  94. unsigned long flags;
  95. spin_lock_irqsave(&queue->s_lock, flags);
  96. result = (queue->len == 0);
  97. if (!result && elem)
  98. *elem = queue->buf[queue->head];
  99. spin_unlock_irqrestore(&queue->s_lock, flags);
  100. return result;
  101. }
  102. /****************************************************************************/
  103. /* Memory allocation routines (stolen from bttv-driver.c)                   */
  104. /****************************************************************************/
  105. /* Here we want the physical address of the memory.
  106.  * This is used when initializing the contents of the area.
  107.  */
  108. static inline unsigned long kvirt_to_pa(unsigned long adr) {
  109.         unsigned long kva, ret;
  110.         kva = (unsigned long) page_address(vmalloc_to_page((void *)adr));
  111. kva |= adr & (PAGE_SIZE-1); /* restore the offset */
  112. ret = __pa(kva);
  113.         return ret;
  114. }
  115. static void *rvmalloc(unsigned long size) {
  116. void *mem;
  117. unsigned long adr;
  118. size = PAGE_ALIGN(size);
  119. mem = vmalloc_32(size);
  120. if (mem) {
  121. memset(mem, 0, size); /* Clear the ram out, no junk to the user */
  122.         adr = (unsigned long)mem;
  123. while (size > 0) {
  124. mem_map_reserve(vmalloc_to_page((void *)adr));
  125. adr += PAGE_SIZE;
  126. size -= PAGE_SIZE;
  127. }
  128. }
  129. return mem;
  130. }
  131. static void rvfree(void * mem, unsigned long size) {
  132.         unsigned long adr;
  133. if (mem) {
  134.         adr = (unsigned long) mem;
  135. while ((long) size > 0) {
  136. mem_map_unreserve(vmalloc_to_page((void *)adr));
  137. adr += PAGE_SIZE;
  138. size -= PAGE_SIZE;
  139. }
  140. vfree(mem);
  141. }
  142. }
  143. /* return a page table pointing to N pages of locked memory */
  144. static int ptable_alloc(void) {
  145. u32 *pt;
  146. int i;
  147. memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
  148. meye.mchip_ptable[MCHIP_NB_PAGES] = pci_alloc_consistent(meye.mchip_dev, 
  149.  PAGE_SIZE, 
  150.  &meye.mchip_dmahandle);
  151. if (!meye.mchip_ptable[MCHIP_NB_PAGES])
  152. return -1;
  153. pt = (u32 *)meye.mchip_ptable[MCHIP_NB_PAGES];
  154. for (i = 0; i < MCHIP_NB_PAGES; i++) {
  155. meye.mchip_ptable[i] = pci_alloc_consistent(meye.mchip_dev, 
  156.     PAGE_SIZE,
  157.     pt);
  158. if (!meye.mchip_ptable[i])
  159. return -1;
  160. pt++;
  161. }
  162. return 0;
  163. }
  164. static void ptable_free(void) {
  165. u32 *pt;
  166. int i;
  167. pt = (u32 *)meye.mchip_ptable[MCHIP_NB_PAGES];
  168. for (i = 0; i < MCHIP_NB_PAGES; i++)
  169. if (meye.mchip_ptable[i])
  170. pci_free_consistent(meye.mchip_dev, 
  171.     PAGE_SIZE, 
  172.     meye.mchip_ptable[i], *pt);
  173. if (meye.mchip_ptable[MCHIP_NB_PAGES])
  174. pci_free_consistent(meye.mchip_dev, 
  175.     PAGE_SIZE, 
  176.     meye.mchip_ptable[MCHIP_NB_PAGES], 
  177.     meye.mchip_dmahandle);
  178. memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
  179. meye.mchip_dmahandle = 0;
  180. }
  181. /* copy data from ptable into buf */
  182. static void ptable_copy(u8 *buf, int start, int size, int pt_pages) {
  183. int i;
  184. for (i = 0; i < (size / PAGE_SIZE) * PAGE_SIZE; i += PAGE_SIZE) {
  185. memcpy(buf + i, meye.mchip_ptable[start++], PAGE_SIZE);
  186. if (start >= pt_pages)
  187. start = 0;
  188. }
  189. memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE);
  190. }
  191. /****************************************************************************/
  192. /* JPEG tables at different qualities to load into the VRJ chip             */
  193. /****************************************************************************/
  194. /* return a set of quantisation tables based on a quality from 1 to 10 */
  195. static u16 *jpeg_quantisation_tables(int *size, int quality) {
  196. static u16 tables0[] = {
  197. 0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  198. 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  199. 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  200. 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  201. 0xffff, 0xffff, 0xffff, 
  202. 0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  203. 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  204. 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  205. 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  206. 0xffff, 0xffff, 0xffff, 
  207. };
  208. static u16 tables1[] = {
  209. 0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46, 
  210. 0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8, 
  211. 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  212. 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  213. 0xffff, 0xffff, 0xffff, 
  214. 0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb, 
  215. 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  216. 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  217. 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
  218. 0xffff, 0xffff, 0xffff, 
  219. };
  220. static u16 tables2[] = {
  221. 0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23, 
  222. 0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164, 
  223. 0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad, 
  224. 0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff, 
  225. 0xe6ff, 0xfffd, 0xfff8, 
  226. 0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876, 
  227. 0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 
  228. 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 
  229. 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 
  230. 0xf8f8, 0xf8f8, 0xfff8, 
  231. };
  232. static u16 tables3[] = {
  233. 0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17, 
  234. 0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042, 
  235. 0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73, 
  236. 0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba, 
  237. 0x99c7, 0xaba8, 0xffa4, 
  238. 0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e, 
  239. 0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 
  240. 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 
  241. 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 
  242. 0xa4a4, 0xa4a4, 0xffa4, 
  243. };
  244. static u16 tables4[] = {
  245. 0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712, 
  246. 0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932, 
  247. 0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556, 
  248. 0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c, 
  249. 0x7396, 0x817e, 0xff7c, 
  250. 0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b, 
  251. 0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 
  252. 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 
  253. 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 
  254. 0x7c7c, 0x7c7c, 0xff7c, 
  255. };
  256. static u16 tables5[] = {
  257. 0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e, 
  258. 0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28, 
  259. 0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745, 
  260. 0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470, 
  261. 0x5c78, 0x6765, 0xff63, 
  262. 0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f, 
  263. 0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 
  264. 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 
  265. 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 
  266. 0x6363, 0x6363, 0xff63, 
  267. };
  268. static u16 tables6[] = {
  269. 0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b, 
  270. 0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20, 
  271. 0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37, 
  272. 0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a, 
  273. 0x4a60, 0x5251, 0xff4f, 
  274. 0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26, 
  275. 0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 
  276. 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 
  277. 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 
  278. 0x4f4f, 0x4f4f, 0xff4f, 
  279. };
  280. static u16 tables7[] = {
  281. 0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08, 
  282. 0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318, 
  283. 0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129, 
  284. 0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43, 
  285. 0x3748, 0x3e3d, 0xff3b, 
  286. 0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c, 
  287. 0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 
  288. 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 
  289. 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 
  290. 0x3b3b, 0x3b3b, 0xff3b, 
  291. };
  292. static u16 tables8[] = {
  293. 0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706, 
  294. 0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710, 
  295. 0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c, 
  296. 0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d, 
  297. 0x2530, 0x2928, 0xff28, 
  298. 0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813, 
  299. 0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 
  300. 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 
  301. 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 
  302. 0x2828, 0x2828, 0xff28, 
  303. };
  304. static u16 tables9[] = {
  305. 0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403, 
  306. 0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08, 
  307. 0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e, 
  308. 0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416, 
  309. 0x1218, 0x1514, 0xff14, 
  310. 0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409, 
  311. 0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 
  312. 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 
  313. 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 
  314. 0x1414, 0x1414, 0xff14, 
  315. };
  316. static u16 tables10[] = {
  317. 0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
  318. 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
  319. 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
  320. 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
  321. 0x0101, 0x0101, 0xff01, 
  322. 0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
  323. 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
  324. 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
  325. 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
  326. 0x0101, 0x0101, 0xff01, 
  327. };
  328. switch (quality) {
  329. case 0:
  330. *size = sizeof(tables0);
  331. return tables0;
  332. case 1:
  333. *size = sizeof(tables1);
  334. return tables1;
  335. case 2:
  336. *size = sizeof(tables2);
  337. return tables2;
  338. case 3:
  339. *size = sizeof(tables3);
  340. return tables3;
  341. case 4:
  342. *size = sizeof(tables4);
  343. return tables4;
  344. case 5:
  345. *size = sizeof(tables5);
  346. return tables5;
  347. case 6:
  348. *size = sizeof(tables6);
  349. return tables6;
  350. case 7:
  351. *size = sizeof(tables7);
  352. return tables7;
  353. case 8:
  354. *size = sizeof(tables8);
  355. return tables8;
  356. case 9:
  357. *size = sizeof(tables9);
  358. return tables9;
  359. case 10:
  360. *size = sizeof(tables10);
  361. return tables10;
  362. default:
  363. printk(KERN_WARNING "meye: invalid quality level %d - using 8n", quality);
  364. *size = sizeof(tables8);
  365. return tables8;
  366. }
  367. return NULL;
  368. }
  369. /* return a generic set of huffman tables */
  370. static u16 *jpeg_huffman_tables(int *size) {
  371. static u16 tables[] = {
  372. 0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405, 
  373. 0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131, 
  374. 0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142, 
  375. 0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918, 
  376. 0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443, 
  377. 0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463, 
  378. 0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483, 
  379. 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A, 
  380. 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8, 
  381. 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6, 
  382. 0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2, 
  383. 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA, 
  384. 0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405, 
  385. 0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206, 
  386. 0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1, 
  387. 0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125, 
  388. 0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A, 
  389. 0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A, 
  390. 0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A, 
  391. 0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 
  392. 0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 
  393. 0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 
  394. 0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2, 
  395. 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA, 
  396. 0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000, 
  397. 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09, 
  398. 0xFF0B, 
  399. 0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101, 
  400. 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09, 
  401. 0xFF0B
  402. };
  403. *size = sizeof(tables);
  404. return tables;
  405. }
  406. /****************************************************************************/
  407. /* MCHIP low-level functions                                                */
  408. /****************************************************************************/
  409. /* waits for the specified miliseconds */
  410. static inline void wait_ms(unsigned int ms) {
  411. if (!in_interrupt()) {
  412. set_current_state(TASK_UNINTERRUPTIBLE);
  413. schedule_timeout(1 + ms * HZ / 1000);
  414. }
  415. else
  416. mdelay(ms);
  417. }
  418. /* returns the horizontal capture size */
  419. static inline int mchip_hsize(void) {
  420. return meye.params.subsample ? 320 : 640;
  421. }
  422. /* returns the vertical capture size */
  423. static inline int mchip_vsize(void) {
  424. return meye.params.subsample ? 240 : 480;
  425. }
  426. /* waits for a register to be available */
  427. static void mchip_sync(int reg) {
  428. u32 status;
  429. int i;
  430. if (reg == MCHIP_MM_FIFO_DATA) {
  431. for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
  432. status = readl(meye.mchip_mmregs + MCHIP_MM_FIFO_STATUS);
  433. if (!(status & MCHIP_MM_FIFO_WAIT)) {
  434. printk(KERN_WARNING "meye: fifo not readyn");
  435. return;
  436. }
  437. if (status & MCHIP_MM_FIFO_READY)
  438. return;
  439. udelay(1);
  440. }
  441. }
  442. else if (reg > 0x80) {
  443. u32 mask = (reg < 0x100) ? MCHIP_HIC_STATUS_MCC_RDY
  444.                  : MCHIP_HIC_STATUS_VRJ_RDY;
  445. for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
  446. status = readl(meye.mchip_mmregs + MCHIP_HIC_STATUS);
  447. if (status & mask)
  448. return;
  449. udelay(1);
  450. }
  451. }
  452. else
  453. return;
  454. printk(KERN_WARNING "meye: mchip_sync() timeout on reg 0x%x status=0x%xn", reg, status);
  455. }
  456. /* sets a value into the register */
  457. static inline void mchip_set(int reg, u32 v) {
  458. mchip_sync(reg);
  459. writel(v, meye.mchip_mmregs + reg);
  460. }
  461. /* get the register value */
  462. static inline u32 mchip_read(int reg) {
  463. mchip_sync(reg);
  464. return readl(meye.mchip_mmregs + reg);
  465. }
  466. /* wait for a register to become a particular value */
  467. static inline int mchip_delay(u32 reg, u32 v) {
  468. int n = 10;
  469. while (--n && mchip_read(reg) != v) 
  470. udelay(1);
  471. return n;
  472. }
  473. /* setup subsampling */
  474. static void mchip_subsample(void) {
  475. mchip_set(MCHIP_MCC_R_SAMPLING, meye.params.subsample);
  476. mchip_set(MCHIP_MCC_R_XRANGE, mchip_hsize());
  477. mchip_set(MCHIP_MCC_R_YRANGE, mchip_vsize());
  478. mchip_set(MCHIP_MCC_B_XRANGE, mchip_hsize());
  479. mchip_set(MCHIP_MCC_B_YRANGE, mchip_vsize());
  480. mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
  481. }
  482. /* set the framerate into the mchip */
  483. static void mchip_set_framerate(void) {
  484. mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);
  485. }
  486. /* load some huffman and quantisation tables into the VRJ chip ready
  487.    for JPEG compression */
  488. static void mchip_load_tables(void) {
  489. int i;
  490. int size;
  491. u16 *tables;
  492. tables = jpeg_huffman_tables(&size);
  493. for (i = 0; i < size / 2; i++)
  494. writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
  495. tables = jpeg_quantisation_tables(&size, meye.params.quality);
  496. for (i = 0; i < size / 2; i++)
  497. writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
  498. }
  499. /* setup the VRJ parameters in the chip */
  500. static void mchip_vrj_setup(u8 mode) {
  501. mchip_set(MCHIP_VRJ_BUS_MODE, 5);
  502. mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL, 0x1f);
  503. mchip_set(MCHIP_VRJ_PDAT_USE, 1);
  504. mchip_set(MCHIP_VRJ_IRQ_FLAG, 0xa0);
  505. mchip_set(MCHIP_VRJ_MODE_SPECIFY, mode);
  506. mchip_set(MCHIP_VRJ_NUM_LINES, mchip_vsize());
  507. mchip_set(MCHIP_VRJ_NUM_PIXELS, mchip_hsize());
  508. mchip_set(MCHIP_VRJ_NUM_COMPONENTS, 0x1b);
  509. mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_LO, 0xFFFF);
  510. mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_HI, 0xFFFF);
  511. mchip_set(MCHIP_VRJ_COMP_DATA_FORMAT, 0xC);
  512. mchip_set(MCHIP_VRJ_RESTART_INTERVAL, 0);
  513. mchip_set(MCHIP_VRJ_SOF1, 0x601);
  514. mchip_set(MCHIP_VRJ_SOF2, 0x1502);
  515. mchip_set(MCHIP_VRJ_SOF3, 0x1503);
  516. mchip_set(MCHIP_VRJ_SOF4, 0x1596);
  517. mchip_set(MCHIP_VRJ_SOS,  0x0ed0);
  518. mchip_load_tables();
  519. }
  520. /* setup for DMA transfers - also zeros the framebuffer */
  521. static int mchip_dma_alloc(void) {
  522. if (!meye.mchip_dmahandle)
  523. if (ptable_alloc())
  524. return -1;
  525. return 0;
  526. }
  527. /* frees the DMA buffer */
  528. static void mchip_dma_free(void) {
  529. if (meye.mchip_dmahandle)
  530. ptable_free();
  531. }
  532. /* sets the DMA parameters into the chip */
  533. static void mchip_dma_setup(void) {
  534. int i;
  535. mchip_set(MCHIP_MM_PT_ADDR, meye.mchip_dmahandle);
  536. for (i = 0; i < 4; i++)
  537. mchip_set(MCHIP_MM_FIR(i), 0);
  538. meye.mchip_fnum = 0;
  539. }
  540. /* stop any existing HIC action and wait for any dma to complete then
  541.    reset the dma engine */
  542. static void mchip_hic_stop(void) {
  543. int i = 0;
  544. meye.mchip_mode = MCHIP_HIC_MODE_NOOP;
  545. if (!(mchip_read(MCHIP_HIC_STATUS) & MCHIP_HIC_STATUS_BUSY)) 
  546. return;
  547. mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_STOP);
  548. mchip_delay(MCHIP_HIC_CMD, 0);
  549. while (!mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE)) {
  550. /*  resetting HIC */
  551. mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_STOP);
  552. mchip_delay(MCHIP_HIC_CMD, 0);
  553. mchip_set(MCHIP_HIC_CTL, MCHIP_HIC_CTL_SOFT_RESET);
  554. wait_ms(250);
  555. if (i++ > 20) {
  556. printk(KERN_ERR "meye: resetting HIC hanged!n");
  557. break;
  558. }
  559. }
  560. wait_ms(100);
  561. }
  562. /****************************************************************************/
  563. /* MCHIP frame processing functions                                         */
  564. /****************************************************************************/
  565. /* get the next ready frame from the dma engine */
  566. static u32 mchip_get_frame(void) {
  567. u32 v;
  568. v = mchip_read(MCHIP_MM_FIR(meye.mchip_fnum));
  569. return v;
  570. }
  571. /* frees the current frame from the dma engine */
  572. static void mchip_free_frame(void) {
  573. mchip_set(MCHIP_MM_FIR(meye.mchip_fnum), 0);
  574. meye.mchip_fnum++;
  575. meye.mchip_fnum %= 4;
  576. }
  577. /* read one frame from the framebuffer assuming it was captured using
  578.    a uncompressed transfer */
  579. static void mchip_cont_read_frame(u32 v, u8 *buf, int size) {
  580. int pt_id;
  581. pt_id = (v >> 17) & 0x3FF;
  582. ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES);
  583. }
  584. /* read a compressed frame from the framebuffer */
  585. static int mchip_comp_read_frame(u32 v, u8 *buf, int size) {
  586. int pt_start, pt_end, trailer;
  587. int fsize;
  588. int i;
  589. pt_start = (v >> 19) & 0xFF;
  590. pt_end = (v >> 11) & 0xFF;
  591. trailer = (v >> 1) & 0x3FF;
  592. if (pt_end < pt_start)
  593. fsize = (MCHIP_NB_PAGES_MJPEG - pt_start) * PAGE_SIZE +
  594. pt_end * PAGE_SIZE + trailer * 4;
  595. else
  596. fsize = (pt_end - pt_start) * PAGE_SIZE + trailer * 4;
  597. if (fsize > size) {
  598. printk(KERN_WARNING "meye: oversized compressed frame %dn", 
  599.        fsize);
  600. return -1;
  601. }
  602. ptable_copy(buf, pt_start, fsize, MCHIP_NB_PAGES_MJPEG);
  603. #ifdef MEYE_JPEG_CORRECTION
  604. /* Some mchip generated jpeg frames are incorrect. In most
  605.  * (all ?) of those cases, the final EOI (0xff 0xd9) marker 
  606.  * is not present at the end of the frame.
  607.  *
  608.  * Since adding the final marker is not enough to restore
  609.  * the jpeg integrity, we drop the frame.
  610.  */
  611. for (i = fsize - 1; i > 0 && buf[i] == 0xff; i--) ;
  612. if (i < 2 || buf[i - 1] != 0xff || buf[i] != 0xd9)
  613. return -1;
  614. #endif
  615. return fsize;
  616. }
  617. /* take a picture into SDRAM */
  618. static void mchip_take_picture(void) {
  619. int i;
  620. mchip_hic_stop();
  621. mchip_subsample();
  622. mchip_dma_setup();
  623. mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_CAP);
  624. mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
  625. mchip_delay(MCHIP_HIC_CMD, 0);
  626. for (i = 0; i < 100; ++i) {
  627. if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
  628. break;
  629. wait_ms(1);
  630. }
  631. }
  632. /* dma a previously taken picture into a buffer */
  633. static void mchip_get_picture(u8 *buf, int bufsize) {
  634. u32 v;
  635. int i;
  636. mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_OUT);
  637. mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
  638. mchip_delay(MCHIP_HIC_CMD, 0);
  639. for (i = 0; i < 100; ++i) {
  640. if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
  641. break;
  642. wait_ms(1);
  643. }
  644. for (i = 0; i < 4 ; ++i) {
  645. v = mchip_get_frame();
  646. if (v & MCHIP_MM_FIR_RDY) {
  647. mchip_cont_read_frame(v, buf, bufsize);
  648. break;
  649. }
  650. mchip_free_frame();
  651. }
  652. }
  653. /* start continuous dma capture */
  654. static void mchip_continuous_start(void) {
  655. mchip_hic_stop();
  656. mchip_subsample();
  657. mchip_set_framerate();
  658. mchip_dma_setup();
  659. meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
  660. mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_OUT);
  661. mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
  662. mchip_delay(MCHIP_HIC_CMD, 0);
  663. }
  664. /* compress one frame into a buffer */
  665. static int mchip_compress_frame(u8 *buf, int bufsize) {
  666. u32 v;
  667. int len = -1, i;
  668. mchip_vrj_setup(0x3f);
  669. udelay(50);
  670. mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_COMP);
  671. mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
  672. mchip_delay(MCHIP_HIC_CMD, 0);
  673. for (i = 0; i < 100; ++i) {
  674. if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
  675. break;
  676. wait_ms(1);
  677. }
  678. for (i = 0; i < 4 ; ++i) {
  679. v = mchip_get_frame();
  680. if (v & MCHIP_MM_FIR_RDY) {
  681. len = mchip_comp_read_frame(v, buf, bufsize);
  682. break;
  683. }
  684. mchip_free_frame();
  685. }
  686. return len;
  687. }
  688. #if 0
  689. /* uncompress one image into a buffer */
  690. static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize) {
  691. mchip_vrj_setup(0x3f);
  692. udelay(50);
  693. mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_DECOMP);
  694. mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
  695. mchip_delay(MCHIP_HIC_CMD, 0);
  696. return mchip_comp_read_frame(buf, bufsize);
  697. }
  698. #endif
  699. /* start continuous compressed capture */
  700. static void mchip_cont_compression_start(void) {
  701. mchip_hic_stop();
  702. mchip_vrj_setup(0x3f);
  703. mchip_subsample();
  704. mchip_set_framerate();
  705. mchip_dma_setup();
  706. meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
  707. mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_COMP);
  708. mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
  709. mchip_delay(MCHIP_HIC_CMD, 0);
  710. }
  711. /****************************************************************************/
  712. /* Interrupt handling                                                       */
  713. /****************************************************************************/
  714. static void meye_irq(int irq, void *dev_id, struct pt_regs *regs) {
  715. u32 v;
  716. int reqnr;
  717. v = mchip_read(MCHIP_MM_INTA);
  718. while (1) {
  719. v = mchip_get_frame();
  720. if (!(v & MCHIP_MM_FIR_RDY))
  721. goto out;
  722. switch (meye.mchip_mode) {
  723. case MCHIP_HIC_MODE_CONT_OUT:
  724. if (!meye_emptyq(&meye.grabq, NULL)) {
  725. int nr = meye_pullq(&meye.grabq);
  726. mchip_cont_read_frame(
  727. v, 
  728. meye.grab_fbuffer + gbufsize * nr,
  729. mchip_hsize() * mchip_vsize() * 2);
  730. meye.grab_buffer[nr].state = MEYE_BUF_DONE;
  731. wake_up_interruptible(&meye.grabq.proc_list);
  732. }
  733. break;
  734. case MCHIP_HIC_MODE_CONT_COMP:
  735. if (!meye_emptyq(&meye.grabq, &reqnr)) {
  736. int size;
  737. size = mchip_comp_read_frame(
  738. v,
  739. meye.grab_fbuffer + gbufsize * reqnr,
  740. gbufsize);
  741. if (size == -1)
  742. break;
  743. reqnr = meye_pullq(&meye.grabq);
  744. meye.grab_buffer[reqnr].size = size;
  745. meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
  746. wake_up_interruptible(&meye.grabq.proc_list);
  747. }
  748. break;
  749. default:
  750. /* do not free frame, since it can be a snap */
  751. goto out;
  752. } /* switch */
  753. mchip_free_frame();
  754. }
  755. out: ;
  756. }
  757. /****************************************************************************/
  758. /* video4linux integration                                                  */
  759. /****************************************************************************/
  760. static int meye_open(struct inode *inode, struct file *file) {
  761. int i, err;
  762. err = video_exclusive_open(inode,file);
  763. if (err < 0)
  764. return err;
  765. if (mchip_dma_alloc()) {
  766. printk(KERN_ERR "meye: mchip framebuffer allocation failedn");
  767. video_exclusive_release(inode,file);
  768. return -ENOBUFS;
  769. }
  770. mchip_hic_stop();
  771. meye_initq(&meye.grabq);
  772. for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
  773. meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
  774. return 0;
  775. }
  776. static int meye_release(struct inode *inode, struct file *file) {
  777. mchip_hic_stop();
  778. video_exclusive_release(inode,file);
  779. return 0;
  780. }
  781. static int meye_do_ioctl(struct inode *inode, struct file *file,
  782.  unsigned int cmd, void *arg) {
  783. switch (cmd) {
  784. case VIDIOCGCAP: {
  785. struct video_capability *b = arg;
  786. strcpy(b->name,meye.video_dev.name);
  787. b->type = VID_TYPE_CAPTURE;
  788. b->channels = 1;
  789. b->audios = 0;
  790. b->maxwidth = 640;
  791. b->maxheight = 480;
  792. b->minwidth = 320;
  793. b->minheight = 240;
  794. break;
  795. }
  796. case VIDIOCGCHAN: {
  797. struct video_channel *v = arg;
  798. v->flags = 0;
  799. v->tuners = 0;
  800. v->type = VIDEO_TYPE_CAMERA;
  801. if (v->channel != 0)
  802. return -EINVAL;
  803. strcpy(v->name,"Camera");
  804. break;
  805. }
  806. case VIDIOCSCHAN: {
  807. struct video_channel *v = arg;
  808. if (v->channel != 0)
  809. return -EINVAL;
  810. break;
  811. }
  812. case VIDIOCGPICT: {
  813. struct video_picture *p = arg;
  814. *p = meye.picture;
  815. break;
  816. }
  817. case VIDIOCSPICT: {
  818. struct video_picture *p = arg;
  819. if (p->depth != 2)
  820. return -EINVAL;
  821. if (p->palette != VIDEO_PALETTE_YUV422)
  822. return -EINVAL;
  823. down(&meye.lock);
  824. sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, 
  825.       p->brightness >> 10);
  826. sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, 
  827.       p->hue >> 10);
  828. sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR, 
  829.       p->colour >> 10);
  830. sonypi_camera_command(SONYPI_COMMAND_SETCAMERACONTRAST, 
  831.       p->contrast >> 10);
  832. meye.picture = *p;
  833. up(&meye.lock);
  834. break;
  835. }
  836. case VIDIOCSYNC: {
  837. int *i = arg;
  838. DECLARE_WAITQUEUE(wait, current);
  839. if (*i < 0 || *i >= gbuffers)
  840. return -EINVAL;
  841. switch (meye.grab_buffer[*i].state) {
  842. case MEYE_BUF_UNUSED:
  843. return -EINVAL;
  844. case MEYE_BUF_USING:
  845. add_wait_queue(&meye.grabq.proc_list, &wait);
  846. current->state = TASK_INTERRUPTIBLE;
  847. while (meye.grab_buffer[*i].state == MEYE_BUF_USING) {
  848. schedule();
  849. if(signal_pending(current)) {
  850. remove_wait_queue(&meye.grabq.proc_list, &wait);
  851. current->state = TASK_RUNNING;
  852. return -EINTR;
  853. }
  854. }
  855. remove_wait_queue(&meye.grabq.proc_list, &wait);
  856. current->state = TASK_RUNNING;
  857. /* fall through */
  858. case MEYE_BUF_DONE:
  859. meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
  860. }
  861. break;
  862. }
  863. case VIDIOCMCAPTURE: {
  864. struct video_mmap *vm = arg;
  865. int restart = 0;
  866. if (vm->frame >= gbuffers || vm->frame < 0)
  867. return -EINVAL;
  868. if (vm->format != VIDEO_PALETTE_YUV422)
  869. return -EINVAL;
  870. if (vm->height * vm->width * 2 > gbufsize)
  871. return -EINVAL;
  872. if (!meye.grab_fbuffer)
  873. return -EINVAL;
  874. if (meye.grab_buffer[vm->frame].state != MEYE_BUF_UNUSED)
  875. return -EBUSY;
  876. down(&meye.lock);
  877. if (vm->width == 640 && vm->height == 480) {
  878. if (meye.params.subsample) {
  879. meye.params.subsample = 0;
  880. restart = 1;
  881. }
  882. }
  883. else if (vm->width == 320 && vm->height == 240) {
  884. if (!meye.params.subsample) {
  885. meye.params.subsample = 1;
  886. restart = 1;
  887. }
  888. }
  889. else {
  890. up(&meye.lock);
  891. return -EINVAL;
  892. }
  893. if (restart || meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT)
  894. mchip_continuous_start();
  895. meye.grab_buffer[vm->frame].state = MEYE_BUF_USING;
  896. meye_pushq(&meye.grabq, vm->frame);
  897. up(&meye.lock);
  898. break;
  899. }
  900. case VIDIOCGMBUF: {
  901. struct video_mbuf *vm = arg;
  902. int i;
  903. memset(vm, 0 , sizeof(*vm));
  904. vm->size = gbufsize * gbuffers;
  905. vm->frames = gbuffers;
  906. for (i = 0; i < gbuffers; i++)
  907. vm->offsets[i] = i * gbufsize;
  908. break;
  909. }
  910. case MEYEIOC_G_PARAMS: {
  911. struct meye_params *p = arg;
  912. *p = meye.params;
  913. break;
  914. }
  915. case MEYEIOC_S_PARAMS: {
  916. struct meye_params *jp = arg;
  917. if (jp->subsample > 1)
  918. return -EINVAL;
  919. if (jp->quality > 10)
  920. return -EINVAL;
  921. if (jp->sharpness > 63 || jp->agc > 63 || jp->picture > 63)
  922. return -EINVAL;
  923. if (jp->framerate > 31)
  924. return -EINVAL;
  925. down(&meye.lock);
  926. if (meye.params.subsample != jp->subsample ||
  927.     meye.params.quality != jp->quality)
  928. mchip_hic_stop(); /* need restart */
  929. meye.params = *jp;
  930. sonypi_camera_command(SONYPI_COMMAND_SETCAMERASHARPNESS,
  931.       meye.params.sharpness);
  932. sonypi_camera_command(SONYPI_COMMAND_SETCAMERAAGC,
  933.       meye.params.agc);
  934. sonypi_camera_command(SONYPI_COMMAND_SETCAMERAPICTURE,
  935.       meye.params.picture);
  936. up(&meye.lock);
  937. break;
  938. }
  939. case MEYEIOC_QBUF_CAPT: {
  940. int *nb = arg;
  941. if (!meye.grab_fbuffer) 
  942. return -EINVAL;
  943. if (*nb >= gbuffers)
  944. return -EINVAL;
  945. if (*nb < 0) {
  946. /* stop capture */
  947. mchip_hic_stop();
  948. return 0;
  949. }
  950. if (meye.grab_buffer[*nb].state != MEYE_BUF_UNUSED)
  951. return -EBUSY;
  952. down(&meye.lock);
  953. if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
  954. mchip_cont_compression_start();
  955. meye.grab_buffer[*nb].state = MEYE_BUF_USING;
  956. meye_pushq(&meye.grabq, *nb);
  957. up(&meye.lock);
  958. break;
  959. }
  960. case MEYEIOC_SYNC: {
  961. int *i = arg;
  962. DECLARE_WAITQUEUE(wait, current);
  963. if (*i < 0 || *i >= gbuffers)
  964. return -EINVAL;
  965. switch (meye.grab_buffer[*i].state) {
  966. case MEYE_BUF_UNUSED:
  967. return -EINVAL;
  968. case MEYE_BUF_USING:
  969. add_wait_queue(&meye.grabq.proc_list, &wait);
  970. current->state = TASK_INTERRUPTIBLE;
  971. while (meye.grab_buffer[*i].state == MEYE_BUF_USING) {
  972. schedule();
  973. if(signal_pending(current)) {
  974. remove_wait_queue(&meye.grabq.proc_list, &wait);
  975. current->state = TASK_RUNNING;
  976. return -EINTR;
  977. }
  978. }
  979. remove_wait_queue(&meye.grabq.proc_list, &wait);
  980. current->state = TASK_RUNNING;
  981. /* fall through */
  982. case MEYE_BUF_DONE:
  983. meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
  984. }
  985. *i = meye.grab_buffer[*i].size;
  986. break;
  987. }
  988. case MEYEIOC_STILLCAPT: {
  989. if (!meye.grab_fbuffer) 
  990. return -EINVAL;
  991. if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
  992. return -EBUSY;
  993. down(&meye.lock);
  994. meye.grab_buffer[0].state = MEYE_BUF_USING;
  995. mchip_take_picture();
  996. mchip_get_picture(
  997. meye.grab_fbuffer,
  998. mchip_hsize() * mchip_vsize() * 2);
  999. meye.grab_buffer[0].state = MEYE_BUF_DONE;
  1000. up(&meye.lock);
  1001. break;
  1002. }
  1003. case MEYEIOC_STILLJCAPT: {
  1004. int *len = arg;
  1005. if (!meye.grab_fbuffer) 
  1006. return -EINVAL;
  1007. if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
  1008. return -EBUSY;
  1009. down(&meye.lock);
  1010. meye.grab_buffer[0].state = MEYE_BUF_USING;
  1011. *len = -1;
  1012. while (*len == -1) {
  1013. mchip_take_picture();
  1014. *len = mchip_compress_frame(meye.grab_fbuffer, gbufsize);
  1015. }
  1016. meye.grab_buffer[0].state = MEYE_BUF_DONE;
  1017. up(&meye.lock);
  1018. break;
  1019. }
  1020. default:
  1021. return -ENOIOCTLCMD;
  1022. } /* switch */
  1023. return 0;
  1024. }
  1025. static int meye_ioctl(struct inode *inode, struct file *file,
  1026.      unsigned int cmd, unsigned long arg)
  1027. {
  1028. return video_usercopy(inode, file, cmd, arg, meye_do_ioctl);
  1029. }
  1030. static int meye_mmap(struct file *file, struct vm_area_struct *vma) {
  1031. unsigned long start = vma->vm_start;
  1032. unsigned long size  = vma->vm_end - vma->vm_start;
  1033. unsigned long page, pos;
  1034. down(&meye.lock);
  1035. if (size > gbuffers * gbufsize) {
  1036. up(&meye.lock);
  1037. return -EINVAL;
  1038. }
  1039. if (!meye.grab_fbuffer) {
  1040. /* lazy allocation */
  1041. meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize);
  1042. if (!meye.grab_fbuffer) {
  1043. printk(KERN_ERR "meye: v4l framebuffer allocation failedn");
  1044. up(&meye.lock);
  1045. return -ENOMEM;
  1046. }
  1047. }
  1048. pos = (unsigned long)meye.grab_fbuffer;
  1049. while (size > 0) {
  1050. page = kvirt_to_pa(pos);
  1051. if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED)) {
  1052. up(&meye.lock);
  1053. return -EAGAIN;
  1054. }
  1055. start += PAGE_SIZE;
  1056. pos += PAGE_SIZE;
  1057. size -= PAGE_SIZE;
  1058. }
  1059. up(&meye.lock);
  1060. return 0;
  1061. }
  1062. static struct file_operations meye_fops = {
  1063. owner: THIS_MODULE,
  1064. open: meye_open,
  1065. release: meye_release,
  1066. mmap: meye_mmap,
  1067. ioctl: meye_ioctl,
  1068. llseek: no_llseek,
  1069. };
  1070. static struct video_device meye_template = {
  1071. owner: THIS_MODULE,
  1072. name: "meye",
  1073. type: VID_TYPE_CAPTURE,
  1074. hardware: VID_HARDWARE_MEYE,
  1075. fops: &meye_fops,
  1076. };
  1077. static int __devinit meye_probe(struct pci_dev *pcidev, 
  1078.                 const struct pci_device_id *ent) {
  1079. int ret;
  1080. unsigned long mchip_adr;
  1081. u8 revision;
  1082. if (meye.mchip_dev != NULL) {
  1083. printk(KERN_ERR "meye: only one device allowed!n");
  1084. ret = -EBUSY;
  1085. goto out1;
  1086. }
  1087. sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 1);
  1088. meye.mchip_dev = pcidev;
  1089. memcpy(&meye.video_dev, &meye_template, sizeof(meye_template));
  1090. if (mchip_dma_alloc()) {
  1091. printk(KERN_ERR "meye: mchip framebuffer allocation failedn");
  1092. ret = -ENOMEM;
  1093. goto out2;
  1094. }
  1095. if ((ret = pci_enable_device(meye.mchip_dev))) {
  1096. printk(KERN_ERR "meye: pci_enable_device failedn");
  1097. goto out3;
  1098. }
  1099. meye.mchip_irq = pcidev->irq;
  1100. mchip_adr = pci_resource_start(meye.mchip_dev,0);
  1101. if (!mchip_adr) {
  1102. printk(KERN_ERR "meye: mchip has no device base addressn");
  1103. ret = -EIO;
  1104. goto out4;
  1105. }
  1106. if (!request_mem_region(pci_resource_start(meye.mchip_dev, 0),
  1107.         pci_resource_len(meye.mchip_dev, 0),
  1108. "meye")) {
  1109. ret = -EIO;
  1110. printk(KERN_ERR "meye: request_mem_region failedn");
  1111. goto out4;
  1112. }
  1113. pci_read_config_byte(meye.mchip_dev, PCI_REVISION_ID, &revision);
  1114. pci_set_master(meye.mchip_dev);
  1115. pci_write_config_byte(meye.mchip_dev, PCI_CACHE_LINE_SIZE, 8);
  1116. pci_write_config_byte(meye.mchip_dev, PCI_LATENCY_TIMER, 64);
  1117. if ((ret = request_irq(meye.mchip_irq, meye_irq, 
  1118.        SA_INTERRUPT | SA_SHIRQ, "meye", meye_irq))) {
  1119. printk(KERN_ERR "meye: request_irq failed (ret=%d)n", ret);
  1120. goto out5;
  1121. }
  1122. meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS);
  1123. if (!meye.mchip_mmregs) {
  1124. printk(KERN_ERR "meye: ioremap failedn");
  1125. ret = -EIO;
  1126. goto out6;
  1127. }
  1128. /* Ask the camera to perform a soft reset. */
  1129. pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
  1130. mchip_delay(MCHIP_HIC_CMD, 0);
  1131. mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
  1132. wait_ms(1);
  1133. mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
  1134. wait_ms(1);
  1135. mchip_set(MCHIP_MM_PCI_MODE, 5);
  1136. wait_ms(1);
  1137. mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
  1138. if (video_register_device(&meye.video_dev, VFL_TYPE_GRABBER, video_nr) < 0) {
  1139. printk(KERN_ERR "meye: video_register_device failedn");
  1140. ret = -EIO;
  1141. goto out7;
  1142. }
  1143. printk(KERN_INFO "meye: Motion Eye Camera Driver v%d.%d.n",
  1144.        MEYE_DRIVER_MAJORVERSION,
  1145.        MEYE_DRIVER_MINORVERSION);
  1146. printk(KERN_INFO "meye: mchip KL5A72002 rev. %d, base %lx, irq %dn", 
  1147. revision, mchip_adr, meye.mchip_irq);
  1148. /* init all fields */
  1149. init_MUTEX(&meye.lock);
  1150. meye.picture.depth = 2;
  1151. meye.picture.palette = VIDEO_PALETTE_YUV422;
  1152. meye.picture.brightness = 32 << 10;
  1153. meye.picture.hue = 32 << 10;
  1154. meye.picture.colour = 32 << 10;
  1155. meye.picture.contrast = 32 << 10;
  1156. meye.picture.whiteness = 0;
  1157. meye.params.subsample = 0;
  1158. meye.params.quality = 7;
  1159. meye.params.sharpness = 32;
  1160. meye.params.agc = 48;
  1161. meye.params.picture = 0;
  1162. meye.params.framerate = 0;
  1163. sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, 32);
  1164. sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, 32);
  1165. sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR, 32);
  1166. sonypi_camera_command(SONYPI_COMMAND_SETCAMERACONTRAST, 32);
  1167. sonypi_camera_command(SONYPI_COMMAND_SETCAMERASHARPNESS, 32);
  1168. sonypi_camera_command(SONYPI_COMMAND_SETCAMERAPICTURE, 0);
  1169. sonypi_camera_command(SONYPI_COMMAND_SETCAMERAAGC, 48);
  1170. return 0;
  1171. out7:
  1172. iounmap(meye.mchip_mmregs);
  1173. out6:
  1174. free_irq(meye.mchip_irq, meye_irq);
  1175. out5:
  1176. release_mem_region(pci_resource_start(meye.mchip_dev, 0),
  1177.    pci_resource_len(meye.mchip_dev, 0));
  1178. out4:
  1179. pci_disable_device(meye.mchip_dev);
  1180. out3:
  1181. mchip_dma_free();
  1182. out2:
  1183. sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0);
  1184. out1:
  1185. return ret;
  1186. }
  1187. static void __devexit meye_remove(struct pci_dev *pcidev) {
  1188. video_unregister_device(&meye.video_dev);
  1189. mchip_hic_stop();
  1190. /* disable interrupts */
  1191. mchip_set(MCHIP_MM_INTA, 0x0);
  1192. free_irq(meye.mchip_irq, meye_irq);
  1193. iounmap(meye.mchip_mmregs);
  1194. release_mem_region(pci_resource_start(meye.mchip_dev, 0),
  1195.    pci_resource_len(meye.mchip_dev, 0));
  1196. pci_disable_device(meye.mchip_dev);
  1197. mchip_dma_free();
  1198. if (meye.grab_fbuffer)
  1199. rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
  1200. sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0);
  1201. printk(KERN_INFO "meye: removedn");
  1202. }
  1203. static struct pci_device_id meye_pci_tbl[] __devinitdata = {
  1204. { PCI_VENDOR_ID_KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002, 
  1205.   PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
  1206. { }
  1207. };
  1208. MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
  1209. static struct pci_driver meye_driver = {
  1210. name: "meye",
  1211. id_table: meye_pci_tbl,
  1212. probe: meye_probe,
  1213. remove: __devexit_p(meye_remove),
  1214. };
  1215. static int __init meye_init_module(void) {
  1216. if (gbuffers < 2)
  1217. gbuffers = 2;
  1218. if (gbuffers > MEYE_MAX_BUFNBRS)
  1219. gbuffers = MEYE_MAX_BUFNBRS;
  1220. if (gbufsize < 0 || gbufsize > MEYE_MAX_BUFSIZE)
  1221. gbufsize = MEYE_MAX_BUFSIZE;
  1222. printk(KERN_INFO "meye: using %d buffers with %dk (%dk total) for capturen",
  1223.        gbuffers, gbufsize/1024, gbuffers*gbufsize/1024);
  1224. return pci_module_init(&meye_driver);
  1225. }
  1226. static void __exit meye_cleanup_module(void) {
  1227. pci_unregister_driver(&meye_driver);
  1228. }
  1229. #ifndef MODULE
  1230. static int __init meye_setup(char *str) {
  1231. int ints[4];
  1232. str = get_options(str, ARRAY_SIZE(ints), ints);
  1233. if (ints[0] <= 0) 
  1234. goto out;
  1235. gbuffers = ints[1];
  1236. if (ints[0] == 1)
  1237. goto out;
  1238. gbufsize = ints[2];
  1239. if (ints[0] == 2)
  1240. goto out;
  1241. video_nr = ints[3];
  1242. out:
  1243. return 1;
  1244. }
  1245. __setup("meye=", meye_setup);
  1246. #endif
  1247. MODULE_AUTHOR("Stelian Pop <stelian.pop@fr.alcove.com>");
  1248. MODULE_DESCRIPTION("video4linux driver for the MotionEye camera");
  1249. MODULE_LICENSE("GPL");
  1250. EXPORT_NO_SYMBOLS;
  1251. MODULE_PARM(gbuffers,"i");
  1252. MODULE_PARM_DESC(gbuffers,"number of capture buffers, default is 2 (32 max)");
  1253. MODULE_PARM(gbufsize,"i");
  1254. MODULE_PARM_DESC(gbufsize,"size of the capture buffers, default is 614400");
  1255. MODULE_PARM(video_nr,"i");
  1256. MODULE_PARM_DESC(video_nr,"video device to register (0=/dev/video0, etc)");
  1257. /* Module entry points */
  1258. module_init(meye_init_module);
  1259. module_exit(meye_cleanup_module);