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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * s3c2410-adc.c
  3.  *
  4.  * S3C2410 ADC 
  5.  *  exclusive with s3c2410-ts.c
  6.  *
  7.  * Author: SeonKon Choi <bushi@mizi.com>
  8.  * Date  : $Date: 2003/01/20 14:24:49 $ 
  9.  *
  10.  * $Revision: 1.1.2.6 $
  11.  *
  12.    Fri Dec 03 2002 SeonKon Choi <bushi@mizi.com>
  13.    - initial
  14.  *
  15.  * This file is subject to the terms and conditions of the GNU General Public
  16.  * License.  See the file COPYING in the main directory of this archive
  17.  * for more details.
  18.  */
  19. #include <linux/config.h>
  20. #include <linux/module.h>
  21. #include <linux/kernel.h>
  22. #include <linux/init.h>
  23. #include <linux/sched.h>
  24. #include <linux/irq.h>
  25. #include <linux/delay.h>
  26. #include <asm/hardware.h>
  27. #include <asm/semaphore.h>
  28. #undef DEBUG
  29. #ifdef DEBUG
  30. #define DPRINTK(x...) {printk(__FUNCTION__"(%d): ",__LINE__);printk(##x);}
  31. #else
  32. #define DPRINTK(x...) (void)(0)
  33. #endif
  34. #define START_ADC_AIN(x) 
  35. ADCCON = PRESCALE_EN | PRSCVL(255) | ADC_INPUT((x)) ; 
  36. ADCCON |= ADC_START; 
  37. }
  38. static struct semaphore adc_lock;
  39. static wait_queue_head_t *adc_wait;
  40. static void adcdone_int_handler(int irq, void *dev_id, struct pt_regs *reg)
  41. {
  42. wake_up(adc_wait);
  43. }
  44. int s3c2410_adc_read(int ain, wait_queue_head_t *wait)
  45. {
  46. int ret = 0;
  47. if (down_interruptible(&adc_lock))
  48. return -ERESTARTSYS;
  49. adc_wait = wait;
  50. START_ADC_AIN(ain);
  51. sleep_on_timeout(adc_wait, HZ/100); /* 10ms */
  52. #if 0
  53. if (signal_pending(current)) {
  54. up(&adc_lock);
  55. return -ERESTARTSYS;
  56. }
  57. #endif
  58. ret = ADCDAT0 ;
  59. up(&adc_lock);
  60. adc_wait = NULL;
  61. DPRINTK("AIN[%d] = 0x%04x, %dn", ain, ret, ADCCON & 0x80 ? 1:0);
  62. return (ret & 0x3ff);
  63. }
  64. int __init s3c2410_adc_init(void)
  65. {
  66. init_MUTEX(&adc_lock);
  67. /* normal ADC */
  68. ADCTSC = 0; //XP_PST(NOP_MODE);
  69. if (request_irq(IRQ_ADC_DONE, adcdone_int_handler, SA_INTERRUPT,
  70. "ADC", NULL) < 0)
  71. goto irq_err;
  72. return 0;
  73. irq_err:
  74. return 1;
  75. }
  76. module_init(s3c2410_adc_init);
  77. #ifdef MODULE
  78. void __exit s3c2410_adc_exit(void)
  79. {
  80. free_irq(IRQ_ADC_DONE, NULL);
  81. }
  82. module_exit(s3c2410_adc_exit);
  83. MODULE_LICENSE("GPL");
  84. #endif