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

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

?? iccard0911.c

?? 嵌入式系統(tǒng)上用的SMARTCARD的驅(qū)動
?? C
?? 第 1 頁 / 共 3 頁
字號:
					}
					ptr++;
					(*rec_len)++;
					if ( *rec_len >= 256 ) return 0;
				}
			}
			else
			{		// Le !=0 && !=-1 (因為Le和Lc不能同時為-1)
				while(1)
				{
					rlt = EVOC_rev_one_byte(ptr,TIMEOUT_MAX_CYCLE,NOT_TS_BIT);
					if (rlt<0) 
					{
						*rec_len = 0;
						return rlt;		// time out err or parity err		
					}
					ptr++;
					(*rec_len)++;		
					if ( *rec_len >= evoc_adpu_Le+2 ) return 0;
				}	
			}
		}
		else if( ( rec_buf[0]==(INS^0xff) )||( rec_buf[0]==(INS^0xfe) ) )
		{
			while(1)
			{
				rlt = EVOC_rev_one_byte(ptr,TIMEOUT_MAX_CYCLE,NOT_TS_BIT);
				if ( rlt==TIMEROUT_ERR) 	return rlt;		// time out exit
				if ( rlt<0 ) 
				{
					*rec_len = 0;
					return rlt;			// parity err
				}
				ptr++;
				(*rec_len)++;
				if ( *rec_len >= 256 ) return 0;
			}					
		}
		else 
		{		// Sw1+ SW2, 收SW2
			ptr++;		//留下上一個收到的字節(jié),是SW1
			(*rec_len)++;			
		
			rlt = EVOC_rev_one_byte(ptr,TIMEOUT_MAX_CYCLE,NOT_TS_BIT);
			if (rlt<0) 
			{
				*rec_len = 0;
				return rlt;		// time out err or parity err		
			}
			ptr++;
			(*rec_len)++;
			return 0;			
		}			
	}
}
//******************************************************
//******************************************************
static void enable_Time1(u_int32_t time_per)
{
		u_int32_t tmod;
		outl(time_per, S3C44B0X_TCNTB1);
		s3c44b0x_unmask_irq(S3C44B0X_INTERRUPT_TIMER1);		
		tmod = inl(S3C44B0X_TCON);
		tmod |= S3C44B0X_TCON_T1_START;
		outl(tmod, S3C44B0X_TCON);
}
//******************************************************
//******************************************************
static void disable_Time1(void)
{
		u_int32_t tmod;
		s3c44b0x_mask_irq(S3C44B0X_INTERRUPT_TIMER1);
		tmod = inl(S3C44B0X_TCON);
		//tmod=0;
		tmod &= ~(S3C44B0X_TCON_T1_START);
		outl(tmod, S3C44B0X_TCON);
}
//*******************************************************
//*******************************************************
static void setup_timer (void)
{
	__u32 rw_tmp;
  
  u_int32_t tmod;
  outl(0x778,S3C44B0X_TCNTB1);
	tmod = inl(S3C44B0X_TCON);
	//tmod=0;
	tmod |= S3C44B0X_TCON_T1_MAN_UPDATE;
	outl(tmod, S3C44B0X_TCON);

	/* initialize the timer period and prescaler */
	rw_tmp  = inl(S3C44B0X_TCFG0);
	rw_tmp &= ~(0xff<<0);
	rw_tmp |= (1)<<0;
	outl(rw_tmp, S3C44B0X_TCFG0);		// prescaler = 1
	
	rw_tmp  = inl(S3C44B0X_TCFG1);
	rw_tmp &= ~(0xf<<0);
	rw_tmp |= 0<<0;
	outl(rw_tmp, S3C44B0X_TCFG1);		// mux = 1/2
	//disable_Time1();
	
	s3c44b0x_unmask_irq(S3C44B0X_INTERRUPT_TIMER1);		
	//tmod = inl(S3C44B0X_TCON);
	//tmod=0;
	//tmod |= S3C44B0X_TCON_T1_AUTO;
	//tmod |= S3C44B0X_TCON_T1_START;
	//outl(tmod, S3C44B0X_TCON);
		
	outl(0x05, S3C44B0X_INTCON);
	
}

/*----------------------------------------------------------------------------*/
/* file_operations functions -------------------------------------------------*/

static ssize_t EVOC_iccard_write (struct file *file,
                        char *buff,       /* the buffer to fill with data */
			size_t len,       /* the length of the buffer.    */
			loff_t *offset) 
{ /* Our offset in the file       */

			int retval=0;
			
		  char txbuf[EVOC_ICCARD_BUF_SIZE];
			
			if ((len>=sizeof(txbuf))||(len<=0))	return -EINVAL;
		  	copy_from_user( txbuf, buff, len);
			
		
			if (card_selected==SAMCARD) {
				EVOC_select_sam();
				delay_cycle(1000);
				if (samcard_err<0) return -1;
			}
			else if(card_selected==USRCARD){
				EVOC_select_usr();
				delay_cycle(1000);
				if (usrcard_err<0) return -1;
			}
			else return NO_SELECTED_CARD_ERR;	
		
			retval = EVOC_iccard_comm(txbuf,len,iccardfifo.buffer,&iccardfifo.len);
			
			if (card_selected==SAMCARD) {
				samcard_err = retval;
			}
			else if(card_selected==USRCARD){
				usrcard_err = retval;
			}
			else return NO_SELECTED_CARD_ERR;	
		#ifdef DEBUG_ICCARD	
				EVOC_show_card_err_msg(retval);
		#endif	
			return retval;

}

/*
 * Called whenever a process attempts to read the device it has already open.
 */

static ssize_t EVOC_iccard_read (struct file *file,
                        char *buff,       /* the buffer to fill with data */
			size_t len,       /* the length of the buffer.    */
			loff_t *offset) 
{ /* Our offset in the file       */	
	int retval = 0;
	
	//sti();	
	if (iccardfifo.len==0) retval=0;
	else 
	{
		retval = iccardfifo.len;
		if ( copy_to_user (buff, iccardfifo.buffer, iccardfifo.len) )
			retval = -EFAULT;
	}	
	iccardfifo.len = 0;
		
  return retval;
}

/*
 * Called whenever a process attempts to do an ioctl to the device it has
 * already open.
 */
static int EVOC_iccard_ioctl(struct inode *inode, struct file *file,
		    unsigned int cmd,     /* the command to the ioctl */
		    unsigned long arg) {  /* the parameter to it      */
	
   int retval=0;
   char flag_test=0;
   switch (cmd) 
   {
		  case EVOC_CARD_SELECT:
				if      ( arg == SAMCARD ) card_selected = SAMCARD;
				else if ( arg == USRCARD ) card_selected = USRCARD;
				else		 	   card_selected = NONECARD;
			break;
		  case EVOC_CARD_RESET:
				if ( card_selected == USRCARD )
			     if (usrcard_err == NO_CARD_ERR) return -1;			        
				retval = EVOC_iccard_reset( iccardfifo.buffer, &iccardfifo.len, card_selected );
				#ifdef DEBUG_ICCARD	
						EVOC_show_card_err_msg(retval);
				#endif
				return retval;
			
			break;	
		  case EVOC_CARD_STATUS:
				if( card_selected == SAMCARD ) 
				{
					if ((retval = put_user(samcard_err, (int *)arg)) < 0)
						  return retval;
				}
				else if ( card_selected == USRCARD ) 
				{
					if ((retval = put_user(usrcard_err, (int *)arg)) < 0)
						return retval;
			  }
				else		 	   return -EINVAL;
			break;    
		  case EVOC_CARD_POWER_OFF:
				if ( card_selected == SAMCARD ) 	EVOC_sam_card_release();
				if ( card_selected == USRCARD ) 	EVOC_usr_card_release();
			break;
			case EVOC_USR_CARD_ERR:
			  printk("usrcard_err = %d\n",usrcard_err);
			  if ((retval = put_user(usrcard_err, (int *)arg)) < 0)
			 		return retval;
			break; 
			case EVOC_SAM_CARD_ERR:
				printk("samcard_err = %d\n",samcard_err);
				if ((retval = put_user(samcard_err, (int *)arg)) < 0)
					return retval;
			break; 
			case EVOC_START_TEST_ETU:
				printk("start half etu time1\n");
				enable_Time1(0x1fff);
				EVOC_select_usr();
				while(1)
				{
					 if(flag_test==0)
					 {
					 		flag_test=1;
					 		CARD_TX_CLR;
					 }
					 else
					 {
					 		flag_test=0;
					 		CARD_TX_SET;
					 }
					 delay_half_etu();					 
				}
			break;
			case EVOC_STOP_TEST_ETU:
				
				printk("start one etu time1\n");
				EVOC_select_sam();
				while(1)
				{
					 if(flag_test==0)
					 {
					 		flag_test=1;
					 		CARD_TX_CLR;
					 }
					 else
					 {
					 		flag_test=0;
					 		CARD_TX_SET;
					 }
					 delay_one_etu();					 
				}
				//disable_Time1();
			break; 
			case EVOC_IC_PIN_TEST:
				printk("IC_PIN_TEST\n");
				switch (arg)
				{
						case SAM_SET_REST:
							EVOC_sam_set_card_rst();
						break;
						case SAM_CLR_REST:
							EVOC_sam_clr_card_rst();
						break;
						case USR_SET_REST:
							EVOC_usr_set_card_rst();
						break;
						case USR_CLR_REST:
							EVOC_usr_clr_card_rst();
						break;
						case SAM_POW_ON:
							EVOC_sam_card_pwr_on();
						break;
						case SAM_POW_OFF:
							EVOC_sam_card_pwr_off();
						break;
						case USR_POW_ON:
							EVOC_usr_card_pwr_on();
						break;
						case USR_POW_OFF:
							EVOC_usr_card_pwr_off();
						break;
						case LED_POW_ON:
							EVOC_LED_ON();
						break;
						case LED_POW_OFF:
							EVOC_LED_OFF();
						break;
						default:
			      break;
				}				
			break;    
		  default:
				return -EINVAL;
			break;
   }
    return 0;
}
	    
/*
 * Called whenever a process attempts to open the device file.
 */
static int EVOC_iccard_open(struct inode *inode, struct file *file) {
  	int err;
  	//int i;
  	//unsigned char b;
  	unsigned long flag;
  	
  	if(iccard_device_open) return -EBUSY;	  
  	MOD_INC_USE_COUNT;

  	/* And my own counter too */
  	iccard_device_open++;
	
		//EVOC_iccard_reset( iccardfifo.buffer, &iccardfifo.len, SAMCARD);
		
	//#ifdef DEBUG_ICCARD	
		//printk("\nRead %d bytes from sam iccard reset: \n",iccardfifo.len); 
		//for (i=0;i<iccardfifo.len;i++) 
			//printk("nread=%d  data=%x \n",i,iccardfifo.buffer[i]);
	//#endif
	
	//#ifdef DEBUG_ICCARD
		//printk("\nRead %d bytes from usr iccard reset: \n",iccardfifo.len); 
		//for (i=0;i<iccardfifo.len;i++) 
			//printk("nread=%d  data=%x \n",i,iccardfifo.buffer[i]);
	//#endif
	card_selected=NONECARD;	

	//init buffer
	iccardfifo.len = 0;		
  EVOC_iccard_set_port();
	//	if (err<0) printk("open err\n");
	#ifdef DEBUG_ICCARD	
		printk("iccard open ok\n");
	#endif
	
		err=request_irq(S3C44B0X_INTERRUPT_TIMER1,etu_time_handle,0,DEVICE_NAME,NULL);
	if(err<0)
    printk("%s: Error registering the device\n", __file__);
  else
    printk("%s: S3C44B0X_INTERRUPT_TIMER1 IRQ : %d\n",
    __file__,S3C44B0X_INTERRUPT_TIMER1);
  local_irq_save(flag);
  //printk("%s: local_irq_save exis\n",__file__);
  setup_timer();
  //printk("%s: setup_time1\n",__file__);
  local_irq_restore(flag); 
  //cli();
  printk("time_flag11 = %d\n",time_flag); 
  //enable_Time1(0xfff);
  //while(time_flag!=1);
  printk("time_flag = %d\n",time_flag);
  disable_Time1(); 
  return 0;  /* open succeed */
}
 
/*
 * Called whenever a process attempts to close the device file.
 */

static int EVOC_iccard_release(struct inode *inode, struct file *file) 
{

	card_selected = NONECARD;
	EVOC_sam_card_release();
	EVOC_usr_card_release();
	free_irq(S3C44B0X_INTERRUPT_TIMER1,NULL);
	MOD_DEC_USE_COUNT;
  /* And my own counter too */
  iccard_device_open--;
  	
  return 0;
}

static struct file_operations iccard_fops = {
  	owner:          THIS_MODULE,
  	read:           EVOC_iccard_read,
  	ioctl:          EVOC_iccard_ioctl,
  	open:           EVOC_iccard_open,
  	release:        EVOC_iccard_release,
  	write:					EVOC_iccard_write,  
};

/*
 * miscdevice structure for misc driver registration.
 */

/*
 * Initialize the driver.
 */
static int __init EVOC_iccard_init(void) 
{
  	int err;	
  	/* Register the misc device driver */
  	EVOC_iccard_set_port();
  	EVOC_sam_card_release();
	  EVOC_usr_card_release();
  	err = register_chrdev(IC_MAJOR,DEVICE_NAME,&iccard_fops);
  	if(err<0)
    		printk("%s: Error registering the device\n", __file__);
  	else
    		printk("%s: Device register with name: %s and number: %d %d\n",
			   __file__, DEVICE_NAME, IC_MAJOR, IC_MINOR);
	#ifdef CONFIG_DEVFS_FS
	  devfs_ICraw=devfs_register(NULL,"iccard",
	               DEVFS_FL_DEFAULT,IC_MAJOR,IC_MINOR,
	               S_IFCHR|S_IRUSR|S_IWUSR,&iccard_fops,NULL);
  #endif
		printk("%s initialized\n",DEVICE_NAME);		
  	return 0;     /* A non zero value means that init_module failed */
}

/*
 * Cleanup - undid whatever EVOCl03_init did.
 */
void EVOC_iccard_cleanup(void) {
        /* IRQ have to be freed after the hardware is instructed not to interrupt
         * the processor any more.
         */
#ifdef CONFIG_DEVFS_FS
	devfs_unregister(devfs_ICraw);
#endif
  unregister_chrdev(IC_MAJOR,DEVICE_NAME);
  
}  

module_init(EVOC_iccard_init);
module_exit(EVOC_iccard_cleanup);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲成av人在线观看导航 | 国产乱妇无码大片在线观看| 亚洲国产精品av| 欧美三级视频在线| 成人黄动漫网站免费app| 午夜精品视频一区| 国产精品三级在线观看| 欧美不卡一二三| 欧美亚洲综合在线| 成人妖精视频yjsp地址| 国产制服丝袜一区| 日韩高清一级片| 亚洲自拍偷拍图区| 国产精品久久久久久久岛一牛影视| 91精品国产高清一区二区三区蜜臀 | 国产精品久久久久9999吃药| 日韩一区二区电影在线| 在线观看成人免费视频| 99国产欧美另类久久久精品| 高清在线不卡av| 精品一区二区免费看| 五月天婷婷综合| 亚洲一卡二卡三卡四卡无卡久久| 国产精品天天看| 国产午夜精品久久久久久免费视| 日韩欧美色综合| 日韩一级大片在线| 欧美精品在线观看播放| 欧美日韩一区不卡| 欧美中文字幕不卡| 91看片淫黄大片一级| 99久久综合色| 成人h精品动漫一区二区三区| 国产一区二区视频在线| 久久99久久99| 国内精品第一页| 国产一区二区主播在线| 经典一区二区三区| 国产麻豆视频精品| 国产精品影视网| 成人黄色综合网站| 成人av在线一区二区| 91在线精品一区二区三区| 成年人国产精品| 色中色一区二区| 欧美亚一区二区| 69堂成人精品免费视频| 日韩色在线观看| 久久嫩草精品久久久精品| 2020国产精品| 国产精品婷婷午夜在线观看| 日韩一区欧美小说| 亚洲精品国产无天堂网2021| 亚洲第一福利视频在线| 天天操天天色综合| 另类专区欧美蜜桃臀第一页| 国产一区二区三区在线观看精品| 国产91精品欧美| 色哟哟精品一区| 欧美日韩国产欧美日美国产精品| 8x8x8国产精品| 国产亚洲福利社区一区| 亚洲理论在线观看| 污片在线观看一区二区| 国产一区二区三区黄视频| 高清久久久久久| 色丁香久综合在线久综合在线观看| 在线观看欧美黄色| 精品区一区二区| 国产精品污污网站在线观看| 亚洲自拍另类综合| 美女脱光内衣内裤视频久久网站| 国产真实乱对白精彩久久| 99精品视频免费在线观看| 欧美亚一区二区| 国产亚洲女人久久久久毛片| 亚洲品质自拍视频| 久久精品国产77777蜜臀| 国产99精品国产| 欧美久久久久久久久久| 国产性天天综合网| 午夜精品久久久久影视| 国产成人欧美日韩在线电影| 色婷婷精品久久二区二区蜜臀av | 欧美经典三级视频一区二区三区| 日韩美女视频19| 麻豆精品久久久| 97久久精品人人爽人人爽蜜臀| 欧美日韩mp4| 国产精品天天看| 麻豆高清免费国产一区| 色999日韩国产欧美一区二区| 欧美一区永久视频免费观看| 国产精品黄色在线观看| 久久精品噜噜噜成人av农村| 91在线云播放| 国产视频一区二区在线观看| 三级精品在线观看| 99久久精品国产一区| 精品日韩在线观看| 亚洲成人精品一区| 91日韩一区二区三区| 欧美精品一区二区三区蜜桃视频| 亚洲欧美日韩小说| 国产精品123| 欧美一级高清片| 亚洲三级理论片| 国产电影一区二区三区| 欧美日韩不卡一区二区| 亚洲区小说区图片区qvod| 国产精品自拍av| 日韩三级伦理片妻子的秘密按摩| 亚洲欧美电影一区二区| 风流少妇一区二区| 精品999在线播放| 日韩va亚洲va欧美va久久| 欧美午夜电影网| 亚洲美女区一区| 91在线小视频| 自拍偷在线精品自拍偷无码专区| 国内精品国产成人| 欧美mv和日韩mv国产网站| 亚洲va欧美va天堂v国产综合| 成人免费高清视频在线观看| 久久久久久久综合日本| 久久激情综合网| 91精品欧美久久久久久动漫| 亚洲激情男女视频| 色狠狠色狠狠综合| 亚洲在线中文字幕| 欧美在线一区二区三区| 亚洲欧美另类综合偷拍| 91丝袜美腿高跟国产极品老师| 国产精品沙发午睡系列990531| 国产99久久久精品| 国产精品久久毛片a| jlzzjlzz亚洲日本少妇| 中文字幕一区av| 97精品国产露脸对白| 亚洲欧美日韩国产综合在线| 99re成人精品视频| 亚洲三级久久久| 色狠狠色狠狠综合| 亚洲mv在线观看| 在线综合亚洲欧美在线视频| 水野朝阳av一区二区三区| 欧美猛男男办公室激情| 日本va欧美va精品发布| 欧美一级淫片007| 极品尤物av久久免费看| 久久久久久97三级| 成人丝袜18视频在线观看| 亚洲日本在线视频观看| 在线精品视频免费观看| 五月激情六月综合| 久久女同性恋中文字幕| www.欧美精品一二区| 亚洲国产一区视频| 日韩丝袜情趣美女图片| 国产精品99久| 亚洲视频一二区| 欧美一区二区三区影视| 国内一区二区视频| 亚洲欧洲一区二区在线播放| 在线观看av一区| 久久不见久久见免费视频7| 中文在线资源观看网站视频免费不卡| 99免费精品视频| 日韩不卡手机在线v区| 久久精品在这里| 91电影在线观看| 国产中文字幕一区| 亚洲一区中文在线| 欧美精品一区二区高清在线观看| 成人综合婷婷国产精品久久免费| 亚洲黄色小视频| 精品99999| 日本高清不卡在线观看| 久久精品999| 亚洲午夜一二三区视频| 久久精品一区蜜桃臀影院| 欧美自拍偷拍一区| 国产精品一区在线观看你懂的| 一区二区三区美女| 久久久国产精品午夜一区ai换脸| 91麻豆精品在线观看| 黄页视频在线91| 亚洲一区免费视频| 国产夜色精品一区二区av| 欧美亚洲一区二区在线| 国产成人精品免费| 青青草伊人久久| 一区二区三区国产| 国产片一区二区| 日韩欧美国产1| 欧美三级电影网站| 99久久99久久精品国产片果冻| 蜜臀av一区二区在线观看| 玉米视频成人免费看| 国产亚洲精品超碰|