亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ads8344_driver.c

?? Linux/S3C44B0下ADS8344驅動源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
  /* intitialize UART 1 & no channel select   *   * GPC10,11,14,15: Output, Pull-up, Init:0  *   * GPC12: TxD1                              *   * GPC13: RxD1                              *   */  val32 = inl(S3C44B0X_PCONC);  outl((val32&0x000FFFFF)|0x5F500000, S3C44B0X_PCONC);    val32=inl(S3C44B0X_PUPC);  outl((val32&0xFFFF33FF)|0x3000, S3C44B0X_PUPC);     val32=inl(S3C44B0X_PDATC);  outl((val32&0xFFFF33FF)|0x00000000, S3C44B0X_PDATC);    /*   * initialize ExtInt 2~7      *   * Normal IRQ,                *   * Enable,                    *   * both edge triggered        *   */  val32 = inl(S3C44B0X_INTMOD);  outl((val32&0xFF1FFFFF), S3C44B0X_INTMOD); /* ExInt2~7: Normal IRQ */    val32 = inl(S3C44B0X_INTMSK);  outl((val32&0xFF1FFFFF)|0x00000000, S3C44B0X_INTMSK); /* Enable ExInt2~7 */    val32=inl(S3C44B0X_EXTINT);  outl((val32&0x888888FF)|0x77777700, S3C44B0X_EXTINT); /* ExInt2~7:both edge*/    val32=inl(S3C44B0X_PCONG);  outl(val32|0x0000FFF0, S3C44B0X_PCONG); /* config PG2~7 as ExtInt2~7 */     /* initialize SIO */  val32=inl(S3C44B0X_PCONE);  outl((val32&0xFFFF3FFF)|0x4000, S3C44B0X_PCONE); /* GPE7(ADS8344-/CS):output(01)*/    val32=inl(S3C44B0X_PUPE);  outl((val32&0xFFFFFF7F)|0x00, S3C44B0X_PUPE); /* GPE7 activate pull up */     val32=inl(S3C44B0X_PDATE);  outl( (val32&0xFFFFFF7F)|0x00000080, S3C44B0X_PDATE); /* GPE7(ADS8344/CS): high,                                                          * deselect ADS8344                                                         */  /* Config GPF5, 6, 7, 8    * GPF5: SIOTxD   * GPF6: Input   * GPF7: SIORxD   * GPF8: SIOCLK   */  val32 = (inl(S3C44B0X_PCONF)&0x3ff)+(3<<19)+(3<<16)+(0<<13)+(3<<10);  outl(val32, S3C44B0X_PCONF);    val32 = (inl(S3C44B0X_PUPD)) & 0x01F; /* Active GPF5, 6, 7, 8 pull up */  outl(val32, S3C44B0X_PUPD);  disable_irq(S3C44B0X_INTERRUPT);                                                      }/* * Reset bits used in each register to their default value. */static void release_adc_hardware(void) {  int val32;    /* reset s3c44b0 ADC */  outl(s3c44b0_adc_psr, S3C44B0X_ADCPSR); /* config prescaler */  val32=inl(S3C44B0X_ADCCON);  outl(val32|0x20, S3C44B0X_ADCCON); /* Sleep ADC */    /* release channel select   */  val32 = inl(S3C44B0X_PDATC);  outl((val32&0xFFFF7FFF)|0x00000000, S3C44B0X_PDATC);      /* reset PE7 to initial state: Input */  val32=inl(S3C44B0X_PCONE);  outl((val32&0xFFFF3FFF)|0x000, S3C44B0X_PCONE); /* config GPE7: input(00) */    /* reset PF5~PF8 to initial state: Input */ //  val32=inl(S3C44B0X_PCONF);//  outl((val32&0xFFC003FF)|0x000000, S3C44B0X_PCONF); /* config GPF5~8: input(000) */    /* reset PG2~7 to initiate state: input(00)*/  val32=inl(S3C44B0X_PCONG);  outl( (val32&0xFFFF000F)|0x00000000, S3C44B0X_PCONG); /* config PG2~7 as input */      EXT_AD_DESELECT; /* Add on Dec. 05 */    disable_irq(S3C44B0X_INTERRUPT_SIO);   disable_irq(CHA_IRQ_0);  disable_irq(CHA_IRQ_1);  disable_irq(CHA_IRQ_2345);   /* kill sample thread */  if (NULL != sample_ctrl.monitor_thread)  {    sample_shutdown = 1;    send_sig(SIGKILL, sample_ctrl.monitor_thread, 1);  }                          }static int init_adc_drv(void) {  int err;    init_adc_gpio();   /*    * create a kernel thread for sensor ADC sampling   */      sample_ctrl.monitor_thread = NULL;   sample_ctrl.sample_ms      = current_params.sample_ms;   sample_shutdown            = 0;   if ((err = kernel_thread(adc_sample_thread, &sample_ctrl, 0)) < 0)    return err;      return 0;}static int ad_start_convert(int channel){  int cha_ctrl = 0;  int ts_busy_flag;  /* Add by Jesse for SIO sharing between TS and ADC */  ts_busy_flag = inl(S3C44B0X_SR_SIOBUSY);  if (0xA5A5A5A5 == ts_busy_flag)    return -1;/* End of add */    /* init SIO transfer */  ad_conv_state_shift(AD_CONV_ST0);  set_SIO_transfer();     switch (channel)  {  case 0:    cha_ctrl = AD_CTRL_CHA0;    break;  case 1:    cha_ctrl = AD_CTRL_CHA1;    break;  case 2:    cha_ctrl = AD_CTRL_CHA2;    break;  case 3:    cha_ctrl = AD_CTRL_CHA3;    break;  case 4:    cha_ctrl = AD_CTRL_CHA4;    break;  case 5:    cha_ctrl = AD_CTRL_CHA5;    break;  default:        release_SIO_transfer();    break;  }     sio_send_ad_ctrl(cha_ctrl);    return 0;}static int ad_convert_is_end(void){  if(ad_conv_state == AD_CONV_END)    return 1;  else    return 0;}static int adc_sample_thread(void *ctrl){  /* Periodically sample channel 0~5 to get A/D data and storage   * into the specific A/D queues:   * Work flow:   * start:    * If A/D is plugged in   *   If it is a dialog A/D   *     Open SIO to get AD conversion result   *   else   *     Fetch the data from interrupt queues and   *     forward to A/D queue   *  endif   * endif   * delay sample interval   * go back to "start" for another loop   */    int i, adc_timeout = 0;    struct ctrl_info_t *h = (struct ctrl_info_t *) ctrl;  lock_kernel();  daemonize();  reparent_to_init();  h->monitor_thread = current;  sprintf(current->comm, "adc_sample_thread");    unlock_kernel();      /* only want to receive SIGKILL */  spin_lock_irq(&current->sigmask_lock);  siginitsetinv(&current->blocked, ADC_THREAD_SHUTDOWN);  recalc_sigpending(current);  spin_unlock_irq(&current->sigmask_lock);      spin_lock_irq(&have_dat_lock);   have_ad_data = 0;  spin_unlock_irq(&have_dat_lock);     while (1)  {    for (i = 0; i < 6; i++)    {      if ((SNR_IS_ON == current_params.cha[i].snr_online)     &&          (SNR_OPER_NORMAL == current_params.cha[i].snr_oper) &&          (SNR_TYPE_ANALOG == current_params.cha[i].snr_type)                  )      {         for (;;)        { /* wait for A/D conversion end */          nsyadc_sleep(1);                              if (ad_convert_is_end())          {          	adc_queue_node.snr_value = ad_conv_val;           	ad_conv_state_shift(AD_CONV_IDLE);          	            /* storage the conversion into the queue */            adc_queue_node.snr_channel = i;            adc_queue_node.snr_type  = current_params.cha[i].snr_type;              do_gettimeofday(&adc_queue_node.ad_timeval);                        put_in_queue((char *)&adc_queue_node,SNR_DATITEM_LEN);                         spin_lock_irq(&have_dat_lock);                    have_ad_data = 1;            spin_unlock_irq(&have_dat_lock);                        /* signal asynchronous readers that data arrives */            if(queue->fasync)              kill_fasync(&queue->fasync, SIGIO, POLL_IN);            wake_up_interruptible(&queue->proc_list);  /* tell user space progs */            break;          }                    if (++adc_timeout >= MAX_CONV_TIME)          {          	ad_conv_state_shift(AD_CONV_IDLE); /* Add on Dec.05, 2007 */            break;          }                   }      }      else if ((SNR_IS_ON == current_params.cha[i].snr_online)      &&               (SNR_OPER_NORMAL == current_params.cha[i].snr_oper)  &&               (SNR_TYPE_DIGITAL == current_params.cha[i].snr_type) &&               (AD_DIGIT_END == ad_digit_st[i])                       )      {  /* there is valid digit data */        adc_queue_node.snr_channel = i;        adc_queue_node.snr_type  = current_params.cha[i].snr_type;        do_gettimeofday(&adc_queue_node.ad_timeval);        adc_queue_node.snr_value = adc_digit_sample[i].ad_count_dur;        put_in_queue((char *)&adc_queue_node,SNR_DATITEM_LEN);                spin_lock_irq(&have_dat_lock);         have_ad_data = 1;        spin_unlock_irq(&have_dat_lock);                    spin_lock_irq(&digit_lock);        ad_digit_st[i] = AD_DIGIT_BEGIN;        spin_unlock_irq(&digit_lock);                       /* signal asynchronous readers that data arrives */        if(queue->fasync)          kill_fasync(&queue->fasync, SIGIO, POLL_IN);        wake_up_interruptible(&queue->proc_list);  /* tell user space progs */      }    }    nsyadc_sleep(h->sample_ms);        if (signal_pending(current))     {      siginfo_t info;            if (sample_shutdown)      { /* Only honor the signal if we're cleaning up */        printk(KERN_WARNING "%s received signal.\n",               current->comm);        break;      }            /*       * Someone else sent us a kill (probably       * the shutdown scripts "Sending all       * processes the KILL signal").  Just       * dequeue it and ignore it.       */      spin_lock_irq(&current->sigmask_lock);      (void)dequeue_signal(&current->blocked, &info);      spin_unlock_irq(&current->sigmask_lock);    }     } /* while (1) */    return 0; }/*----------------------------------------------------------------------------*//* flow functions ------------------------------------------------------------*//* * Set ADS8344 and SIO parameters for transfer. */static void set_SIO_transfer(void) {  int i;   SET_SIOSBRDR(SIO_PRESCALER); /* Set baud rate      */  SET_SIOIVTCNT(SIO_IVTCNT);   /* Set SIO interval   */  EXT_AD_SELECT;               /* Select ADS8344.    */   for (i = 0; i < 500; i++);     CLEAR_SIO_IRQ;               /* Consume residual irq from sio */  enable_irq(S3C44B0X_INTERRUPT_SIO);}/* * Clock the Burr-Brown to fall the AD_BUSY.  * With a 'start' bit and PD1,PD0 = 00 to enable PENIRQ. * Used for the first pen irq after booting. And when error occures during * conversion that need an initialisation. */static void sio_send_ad_ctrl(int channel) {  WRITE_SIODATA(channel);    SIO_START; /* start SIO transmission */}/* * Release transfer settings. */static void release_SIO_transfer(void) {  disable_irq(S3C44B0X_INTERRUPT_SIO);  SIO_DISABLE;  EXT_AD_DESELECT;}/* * Send ADS8344 control byte. */ static void set_ad_ctrl(int sio_cmd_data){  int i;    for (i = 0; i < 500; i++);    WRITE_SIODATA(sio_cmd_data);    SIO_START; /* start SIO */}/* * Get A/D conversion result. */static void read_conv_dat(int bits){  short temp;    switch (bits)  {  case BIT15_BIT9:     /*       * The first clock is used for BUSY signal,      * the real data start from Bit 6:      * SIODATA:       Bit 7    6     5   4   3     2   1   0       *    |               X  D15  D14  D13  D12  D11  D10  D9      *    \/      * ad_conv_val : Bit 31-16  15  14   13  12  11  10  9 8 - 0      *                    X - X D15 D14 D13 D12 D11 D10 D9 X - X      */      temp = SIODATA;      ad_conv_val = (temp & 0x3F) << 6;      break;        case BIT8_BIT1:     /* SIODATA      : Bit  7   6   5   4   3   2    1   0       *    |                D8  D7  D6  D5  D4  D3  D2  D1      *    \/      * ad_conv_val : Bit 31-16  D15-D9  D8 - D1 D0      *        :     0     X - X D15-D9  D8 - D1 X      */      temp = SIODATA;      ad_conv_val |= ((temp << 1) & 0x1fe);      break;    case BIT0_BIT0:     /* SIODATA      : Bit  7    6   0       *    |                D0   X - X      *    \/      * ad_conv_val : Bit 31-16  D15-D1  D0      *        :     0     X - X D15-D1  D0      */      temp = SIODATA;      ad_conv_val |= ((temp >> 4) &0x5);      ad_conv_val &= 0x0000FFFF;      break;       }  }static void ad_conv_state_shift(int new_state){	spin_lock_irq(&conv_state_lock);   ad_conv_state = new_state;  spin_unlock_irq(&conv_state_lock); }/* * Get one char from the queue buffer. * AND the head with 'AD_BUF_SIZE -1' to have the loopback */static unsigned char get_char_from_queue(void) {  unsigned char result;  result = queue->buf[queue->tail];  /*  queue->tail = (queue->tail + 1) & (AD_BUF_SIZE - 1);  */  queue->tail = (queue->tail + 1) % (AD_BUF_SIZE);    spin_lock_irq(&queue->lock);	queue->count--;	spin_unlock_irq(&queue->lock);  return result;}/* * Write one event in the queue buffer. * Test if there is place for an event = the head cannot be just one event * length after the queue. */static void put_in_queue(char *in, int len) {  unsigned long head    = queue->head;  /*  unsigned long maxhead = (queue->tail - len) & (AD_BUF_SIZE - 1);  */  int i;    if ( (queue->count >= AD_BUF_SIZE) ||       ((queue->head + len) > AD_BUF_SIZE)     )	{		printk("%0: ADC queue is full !!!!\n", __file__);		return;	}		for(i=0;i<len;i++)   {  	queue->buf[head] = in[i];    head++;  }  queue->head = head;    spin_lock_irq(&queue->lock);	queue->count += len;	spin_unlock_irq(&queue->lock);  }/* * Test if queue is empty. */static inline int queue_empty(void) {  /* return queue->head == queue->tail; */  return (queue->count == 0);  }/*----------------------------------------------------------------------------*//* Interrupt functions -------------------------------------------------------*//* * sio interrupt service. *///static void handle_sio_irq(void)static void handle_sio_irq(int irq, void *dev_id, struct pt_regs *regs){  unsigned long flags;  int ts_busy_flag;/* Add by Jesse for SIO sharing between TS and ADC */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91免费观看国产| 国内精品伊人久久久久av影院| 美女在线一区二区| 日韩一区二区免费在线电影 | 2021中文字幕一区亚洲| 青青草国产精品97视觉盛宴| 91麻豆福利精品推荐| 国产精品福利一区| 欧美影院一区二区| 日韩成人免费电影| 2021中文字幕一区亚洲| 国产乱对白刺激视频不卡| 久久网站热最新地址| 国内精品视频666| 国产欧美日韩在线观看| 国产成人综合在线播放| 国产日本欧美一区二区| 99久久99久久免费精品蜜臀| 国产欧美日韩精品a在线观看| 国产剧情av麻豆香蕉精品| 国产午夜精品在线观看| 成人激情视频网站| 亚洲综合色区另类av| 欧美一区二区三区喷汁尤物| 亚洲成av人片在线观看| 91精品国产欧美日韩| 精品一区免费av| 自拍偷拍亚洲欧美日韩| 欧美高清性hdvideosex| 精品一区二区三区不卡 | 国产在线精品免费| 亚洲欧洲日产国码二区| 欧美日韩在线亚洲一区蜜芽| 亚瑟在线精品视频| 国产精品全国免费观看高清| 成人av电影在线播放| 亚洲精品欧美二区三区中文字幕| 欧美色大人视频| 国产精品一区二区久久精品爱涩| 亚洲欧美影音先锋| 日韩欧美另类在线| 91麻豆精品在线观看| 日本女优在线视频一区二区| 26uuu成人网一区二区三区| 91亚洲资源网| 韩国v欧美v日本v亚洲v| 亚洲综合色区另类av| 精品国产百合女同互慰| 日本韩国欧美一区| 国产精品一二三| 免费人成精品欧美精品 | 精品国偷自产国产一区| 91视频国产资源| 国产河南妇女毛片精品久久久| 一区二区三区视频在线看| 精品国产凹凸成av人网站| 色婷婷av久久久久久久| 成人爽a毛片一区二区免费| 午夜精品久久久久久久久| 国产精品久久久久精k8| 精品少妇一区二区三区视频免付费 | 欧美日韩精品电影| a美女胸又www黄视频久久| 麻豆精品精品国产自在97香蕉| 亚洲美女屁股眼交| 亚洲视频1区2区| 中文字幕在线不卡一区| 2014亚洲片线观看视频免费| 91久久一区二区| 91视频免费观看| 91同城在线观看| 色呦呦日韩精品| 日本精品一区二区三区四区的功能| 韩国女主播成人在线观看| 青青国产91久久久久久| 亚洲444eee在线观看| 国产精品美女久久久久高潮| 日韩一级大片在线观看| 欧美日韩国产中文| 欧美男人的天堂一二区| 欧美三级电影在线看| 色偷偷88欧美精品久久久| 粉嫩aⅴ一区二区三区四区| 精品一区二区三区免费毛片爱| 美女免费视频一区二区| 日本视频一区二区三区| 日本在线不卡视频| 免费亚洲电影在线| 国产东北露脸精品视频| 国产美女视频一区| 成人黄色免费短视频| 99久久国产综合精品女不卡| 国产伦精品一区二区三区视频青涩| 强制捆绑调教一区二区| 久久99精品国产麻豆婷婷| 老司机午夜精品99久久| 久久se精品一区二区| 久久精品国产第一区二区三区| 蜜桃精品视频在线观看| 国产成人午夜99999| 国产精品香蕉一区二区三区| 美女网站一区二区| 国产成人在线免费观看| 成人h版在线观看| 91国偷自产一区二区开放时间| 精品1区2区3区| 欧美成人aa大片| 国产精品久久久久久久久免费相片 | 国产高清亚洲一区| 99re6这里只有精品视频在线观看| 97成人超碰视| 91精品综合久久久久久| 精品剧情v国产在线观看在线| 久久人人超碰精品| 亚洲激情自拍偷拍| 久久国产夜色精品鲁鲁99| 国产一区二区三区日韩| 97se狠狠狠综合亚洲狠狠| 欧美午夜不卡视频| 久久久久久电影| 亚洲成av人片一区二区三区| 亚洲第一福利视频在线| 久久狠狠亚洲综合| 色综合久久久久| 久久综合色之久久综合| 一区在线中文字幕| 精品亚洲国产成人av制服丝袜| 国产成人亚洲综合色影视| 一本色道久久综合精品竹菊| 欧美日韩一区 二区 三区 久久精品| 欧美一区二区三区日韩视频| 久久久五月婷婷| 亚洲风情在线资源站| 国产乱子伦视频一区二区三区| 91网站在线播放| 国产欧美视频在线观看| 亚洲成av人影院| 99久久精品国产毛片| 日韩欧美123| 亚洲电影一区二区三区| 国产福利电影一区二区三区| 在线观看免费成人| 中文字幕欧美国产| 久久成人羞羞网站| 欧美色网站导航| 自拍偷拍亚洲综合| 成人午夜视频网站| 欧美精品一区二区三区在线| 综合中文字幕亚洲| 福利一区二区在线| 精品国产乱码久久久久久影片| 亚洲免费三区一区二区| 国产激情视频一区二区三区欧美| 欧美日韩二区三区| 亚洲一区二区三区爽爽爽爽爽| 韩国三级中文字幕hd久久精品| 韩国女主播一区| 精品久久久久久久一区二区蜜臀| 亚洲精品国产精华液| 国产麻豆视频一区二区| 在线观看91精品国产麻豆| 亚洲一区二区av电影| 99精品久久免费看蜜臀剧情介绍| 欧美电视剧免费全集观看| 午夜精品福利一区二区蜜股av| 91啪九色porn原创视频在线观看| 久久嫩草精品久久久久| 久久国产剧场电影| 久久综合九色综合97婷婷女人| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧洲亚洲国产日韩| 亚洲成人av电影在线| 91福利在线观看| 五月天国产精品| 欧美一级一区二区| 国内精品伊人久久久久av影院| 日韩精品一区国产麻豆| 蜜桃精品视频在线| 久久女同精品一区二区| 国产一区 二区 三区一级| 亚洲精品一区二区三区四区高清| 秋霞影院一区二区| 久久先锋影音av| 不卡的看片网站| 一区二区三国产精华液| 在线观看91精品国产入口| 亚洲二区在线观看| 欧美一区二区精品在线| 国产亚洲成aⅴ人片在线观看| 亚洲va天堂va国产va久| 91精品国产综合久久福利软件| 亚洲一区二区三区中文字幕| 色婷婷国产精品综合在线观看| 亚洲色图第一区| 欧美三级电影一区| 亚洲午夜一二三区视频| 日韩一区和二区| 久久精品999| 中文字幕第一区第二区| 日本道色综合久久|