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

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

?? iccard.b.c

?? 嵌入式系統上用的SMARTCARD的驅動
?? C
?? 第 1 頁 / 共 3 頁
字號:
/************************************************************************************************
* 								
*	Copyright (C) EVOC  Co., LTD. 2003		
*								
*	File name:	IcCard.c				
*	Description:    
*	  							
*	Revision history					
*               2006.05.17      Zou Hong Bo	start.	
*								
************************************************************************************************/
/* Include files--------------------------------------------------------------*/
 
//#include "iccard_hw.h"
#include <linux/version.h>
#include <linux/kernel.h>     /* We're doing kernel work */
#include <linux/module.h>     /* Specifically, a module */ 
#include <linux/interrupt.h>  /* We want interrupts */

#include <linux/miscdevice.h> /* for misc_register() and misc_deregister() */

#include <linux/fs.h>         /* for struct 'file_operations' */

#include <linux/timer.h>     /* for timeout interrupts */
#include <linux/param.h>     /* for HZ. HZ = 100 and the timer step is 1/100 */
#include <linux/sched.h>     /* for jiffies definition. jiffies is incremented*/
                              /* once for each clock tick; thus it's incremented*/			      
                              /* HZ times per secondes.*/
#include <linux/mm.h>        /* for verify_area */
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/iccard.h>

#include <asm/irq.h>         /* For IRQ_MACHSPEC */
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/arch/irqs.h>
#include <asm/arch/hardware.h>
#include <asm/44b.h>
#include <asm/def.h>



#define DEBUG_ICCARD	// for debug only
//#define NULL 0

#define	CPU_CARD	0x01
#define	SAM_CARD	0x02

#define	CPU_CARD_POW	(1<<3)
#define	SAM_CARD_POW	(1<<2)

#define	CPU_CARD_RST	(1<<6)
#define	SAM_CARD_RST	(1)

#define IC_LED_POW    (1<<8)

//#define	TIMEROUT_ERR	0xff
#define	MAX_TIME_OUT	0XFFF0
#define	CARD_OUT	(1<<12)
#define	CARD_IN	(1<<13)

//#define CARD_RX 		(rPDATC&CARD_IN	)? 1:0	
//#define CARD_TX_SET		rPDATC = rPDATC|CARD_OUT
//#define CARD_TX_CLR		rPDATC = rPDATC&(~CARD_OUT)

#define CARD_RX 		(inl(S3C44B0X_PDATC) & CARD_IN	)? 1:0	
#define CARD_TX_SET		outl(inl(S3C44B0X_PDATC) | CARD_OUT,S3C44B0X_PDATC)
#define CARD_TX_CLR		outl(inl(S3C44B0X_PDATC) &(~CARD_OUT),S3C44B0X_PDATC)

#define RE_REVEIVE_TIMES	3			//重發重收的次數
#define RE_SEND_TIMES		3			//重發重收的次數

#define etu_time_all  0x2ac
#define etu_time_half  0x366


#define ATR_MAX_LEN		32			//max atr len

#define TS_BIT		1
#define NOT_TS_BIT	0

#define LAST_BYTE		1
#define NOT_LAST_BYTE		0

#define POSITIVE_LOGIC	0
#define NEGATIVE_LOGIC	1

#define EVOC_ICCARD_BUF_SIZE 1024

#define TIMEOUT_MAX_CYCLE  (360000*TC2_WI)			//120000 about 1s 960etu
#define REV_TS_TIMEOUT_CYCLE	  180000	

static struct ICCARDFIFO {
	unsigned char buffer[EVOC_ICCARD_BUF_SIZE];
	int len;
}iccardfifo;

#ifdef CONFIG_DEVFS_FS 
	static devfs_handle_t devfs_IC_dir,devfs_ICraw;
#endif

#define IC_MAJOR   115
#define IC_MINOR   0
#define DEVICE_NAME    "s3c44b0ic"

static int TC2_WI = 10;

static int logic_mode_sam = POSITIVE_LOGIC;
static int logic_mode_usr = POSITIVE_LOGIC;

static unsigned char protect_time_sam = 0;
static unsigned char protect_time_usr = 0;

static int samcard_err = -1;
static int usrcard_err = -1;

static int card_selected=NONECARD;

unsigned char iccard_ctr=0;

static const char* __file__ = __FILE__;
static int    iccard_device_open = 0;   /* number of open device to prevent concurrent*/
                                         /* access to the same device */
static char time_flag=0;
//*******************************************************
//*******************************************************
static unsigned char swapbits(unsigned char i) 
{
  return i >> 7
       | (i & 0x40) >> 5
       | (i & 0x20) >> 3
       | (i & 0x10) >> 1
       | (i & 0x08) << 1
       | (i & 0x04) << 3
       | (i & 0x02) << 5
       | i << 7;
}

//*******************************************************
//*******************************************************
static void EVOC_LED_ON(void)
{
	outl((inl(S3C44B0X_PDATC) & (~IC_LED_POW )),S3C44B0X_PDATC);
	
}
//*******************************************************
//*******************************************************
static void EVOC_LED_OFF(void)
{
	outl((inl(S3C44B0X_PDATC) | (IC_LED_POW)),S3C44B0X_PDATC);
}
//*******************************************************
//*******************************************************
static void etu_time_handle(int irq,void *dev_id,struct pt_regs *regs)
{
		time_flag = 1;
		printk("input time interrupt\n");
		//outl(0x777, S3C44B0X_TCNTB1);
		s3c44b0x_clear_pb(S3C44B0X_INTERRUPT_TIMER1);
		//outl(0x1000, S3C44B0X_F_ISPC);
}
//*******************************************************
//*******************************************************
static void delay_1200_cycle(void)
{	
	//500 cycles=148us
	int i;
	for(i=0;i<3000;i++);
}
//*******************************************************
//*******************************************************
static void delay_cycle(unsigned int count)
{	
	//500 cycles=148us
	//int i;
	for(;count>0;count--);
}
//*******************************************************
//*******************************************************
static void EVOC_iccard_set_port(void)
{
		u_int32_t tmod;
		outl(0xf1555555,S3C44B0X_PCONC);
		//rPCONC = 0xf1555555;	// rxd1 as input; txd1 as output
								// pc12 is txd1; pc13 is rxd1
		outl(0xF9FF,S3C44B0X_PDATC);						
		//rPDATC = 0xF9FF;
		tmod = inl(S3C44B0X_PCONE);
		tmod &= ~(0x03<<6);
		tmod |= 0x01<<6;
		tmod &= ~(0x03<<16);
		tmod |= 0x01<<16;
				
		outl(tmod,S3C44B0X_PCONE);
		
		outl((inl(S3C44B0X_PDATE) & 0x77),S3C44B0X_PDATE);
		
		tmod = inl(S3C44B0X_PCONG);
		tmod &= ~(0x03<<12);
		tmod |= 0x01<<12;
				
		outl(tmod,S3C44B0X_PCONG);
		
		outl((inl(S3C44B0X_PDATG) | 0x40),S3C44B0X_PDATG);
		
		// zhp add 20060608 for GPF6
		outl(0X8040A,S3C44B0X_PCONF);
		outl(0X14F,S3C44B0X_PDATF);
		//rPCONF = 0X8040A;		     
		//rPDATF = 0X14F;

}
//*******************************************************
//*******************************************************
static void EVOC_select_usr(void)
{
	outl((inl(S3C44B0X_PDATE) | 0x08),S3C44B0X_PDATE);
}
//*******************************************************
//*******************************************************
static void EVOC_select_sam(void)
{
	outl((inl(S3C44B0X_PDATE) & 0x77),S3C44B0X_PDATE);
}
//*******************************************************
//*******************************************************
static void EVOC_usr_set_card_rst(void)
{
	//outl(inl(S3C44B0X_PDATE) | 0x08,S3C44B0X_PDATE);
	outl((inl(S3C44B0X_PDATG) & (~CPU_CARD_RST)),S3C44B0X_PDATG);
}
//*******************************************************
//*******************************************************
static void EVOC_usr_clr_card_rst(void)
{
	//outl(inl(S3C44B0X_PDATE) | 0x08,S3C44B0X_PDATE);
	outl((inl(S3C44B0X_PDATG) | (CPU_CARD_RST)),S3C44B0X_PDATG);
}
//*******************************************************
//*******************************************************
static void EVOC_usr_card_pwr_off(void)
{
	outl((inl(S3C44B0X_PDATC) | (CPU_CARD_POW)),S3C44B0X_PDATC);
	EVOC_LED_OFF();
}
//*******************************************************
//*******************************************************
static void EVOC_usr_card_pwr_on(void)
{
	outl((inl(S3C44B0X_PDATC) & (~CPU_CARD_POW)),S3C44B0X_PDATC);
	EVOC_LED_ON();
}
//*******************************************************
//*******************************************************
static void EVOC_sam_set_card_rst(void)
{
	//outl(inl(S3C44B0X_PDATE) & 0x77,S3C44B0X_PDATE);
	outl((inl(S3C44B0X_PDATC) & (~SAM_CARD_RST)),S3C44B0X_PDATC);
}
//*******************************************************
//*******************************************************
static void EVOC_sam_clr_card_rst(void){
	//outl(inl(S3C44B0X_PDATE) & 0x77,S3C44B0X_PDATE);
	outl((inl(S3C44B0X_PDATC) | (SAM_CARD_RST)),S3C44B0X_PDATC);
}
//*******************************************************
//*******************************************************
static void EVOC_sam_card_pwr_off(void){
	outl((inl(S3C44B0X_PDATC) | (SAM_CARD_POW)),S3C44B0X_PDATC);
	EVOC_LED_OFF();
}
//*******************************************************
//*******************************************************
static void EVOC_sam_card_pwr_on(void){
	outl((inl(S3C44B0X_PDATC) & (~SAM_CARD_POW)),S3C44B0X_PDATC);
	EVOC_LED_ON();
}

//*******************************************************
//*******************************************************
static void EVOC_sam_card_release(void){
	EVOC_sam_clr_card_rst();
	EVOC_sam_card_pwr_off();
	iccardfifo.len = 0;
}
//*******************************************************
//*******************************************************
static void EVOC_usr_card_release(void){
	EVOC_usr_clr_card_rst();
	EVOC_usr_card_pwr_off();
	iccardfifo.len = 0;		

}
//*******************************************************
//*******************************************************
int EVOC_show_card_err_msg(int errcode){
	printk("\nerrcode = %d ,  ",errcode); 
	if (errcode>=0){
		printk("OK!\n"); 	
	}
	else if (errcode == TIMEROUT_ERR) {
		printk("Time out err\n"); 
	}
	else if (errcode == PARITY1_ERR) {
		printk("receive parity err\n"); 
	}
	else if (errcode == PARITY2_ERR) {
		printk("send parity err\n"); 
	}
	else if (errcode == CARD_ERR) {
		printk("card err, not cpu card\n"); 
	}
	else if (errcode == ATR_LEN_ERR) {
		printk("card response len err\n"); 
	}
	else if (errcode == ATR_XOR_ERR) {
		printk("card response parity err\n"); 
	}
	else if (errcode == NO_SELECTED_CARD_ERR) {
		printk("No card be selected err\n"); 
	}
	else if (errcode == ADPU_ERR) {
		printk("ADPU CMD format err\n"); 
	}
	else if (errcode == NO_CARD_ERR) {
		printk("No card in card slot err\n"); 
	}
	else { 
		printk("other  err\n"); 
	}
	return 0;
}
//*******************************************************
//*******************************************************
void	delay_half_etu(void)
{	// about 52u	//40MHz
	int i;
	for(i=0;i<730;i++);//768
}
//*******************************************************
//*******************************************************
void	delay_one_etu(void)
{	// about 104u	//40MHz
	int i;
	for(i=0;i<1500;i++);//1547
}
//*******************************************************
//*******************************************************
static int EVOC_send_one_byte(unsigned char * send_data, int send_last_byte){

	int i;
	unsigned char senddata;
	int re_send_times;
	int send_parity_bit;
	unsigned char protect_time=0;

	re_send_times = 0;

	if (card_selected==SAMCARD) {
		protect_time = protect_time_sam;
		if (logic_mode_sam == NEGATIVE_LOGIC) {
			senddata =  swapbits(*send_data);
		}
		else{
			senddata =  (*send_data);
		}
	}
	else if(card_selected==USRCARD){
		protect_time = protect_time_usr;
		if (logic_mode_usr == NEGATIVE_LOGIC){
			senddata =  swapbits(*send_data);
		}
		else {
			senddata =  (*send_data);
		}
	}
	else return NO_SELECTED_CARD_ERR;

	send_parity_bit =  ( (  senddata         >> 7)
			    ^( (senddata & 0x40) >> 6)
			    ^( (senddata & 0x20) >> 5)
			    ^( (senddata & 0x10) >> 4)
			    ^( (senddata & 0x08) >> 3)
		            ^( (senddata & 0x04) >> 2)
		            ^( (senddata & 0x02) >> 1)
		            ^( (senddata & 0x01)     ) ); 
		            
//	if (senddata==0x84) send_parity_bit=1;
	
	CARD_TX_SET;
	
	while ( re_send_times < RE_SEND_TIMES )
	{
		if (card_selected==SAMCARD) 
		{
			//EVOC_select_sam();		
		}
		else if(card_selected==USRCARD)
		{
			//EVOC_select_usr();	
		}
		else return NO_SELECTED_CARD_ERR;	
			
		CARD_TX_CLR;	//start bit
		delay_one_etu();	// 1 etu
		
		for(i=0;i<8;i++)
		{	//8 bit data
			if ( (senddata>>i)&0x01 ) 
				CARD_TX_SET;
			else 	
				CARD_TX_CLR;

			delay_one_etu();	//2 - 9 etu
		}
			
		if ( send_parity_bit ) 		//parity bit
			CARD_TX_SET;
		else 	
			CARD_TX_CLR;
		delay_one_etu();		//10 etu
	
		delay_one_etu();		//11 etu
		
		if ( CARD_RX ) 
		{		// send protect bit	
			delay_one_etu();  //12 etu
			
			if (send_last_byte==LAST_BYTE)
				return 0;
			if ( (protect_time==0)||(protect_time==0xff) )
				return 0;
			else
			{
				for(i=0;i<protect_time;i++)
				{
					delay_one_etu(); 	// 13 ~ (12+N) etu
				}
				return 0;
			}
		}

		delay_one_etu();	//12 etu, send err
		delay_one_etu();	//13 etu
		re_send_times++;
	}
	return PARITY2_ERR;
}
//*******************************************************
//*******************************************************
static int EVOC_rev_one_byte(unsigned char * rev_data, unsigned int timeout, int rev_TS){

	unsigned char * revdata;
	unsigned int  i;
	unsigned long count;
	int re_rev_times;
	unsigned char parity_bit;
	int card_logic_mode;
	
	if (card_selected==SAMCARD) 
	{
		card_logic_mode = logic_mode_sam;		
	}
	else if(card_selected==USRCARD)
	{
		card_logic_mode = logic_mode_usr;
	}
	else return NO_SELECTED_CARD_ERR;
	
	re_rev_times = 0;
	revdata = rev_data;
	
	while ( re_rev_times < RE_REVEIVE_TIMES )
	{
		if (card_selected==SAMCARD) 
		{
			//EVOC_select_sam();
		}
		else if(card_selected==USRCARD)	
		{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色欧美日韩亚洲| 国产福利精品导航| 一区二区三区高清不卡| 1024成人网| 亚洲免费在线播放| 天天射综合影视| 日韩国产欧美视频| 高清视频一区二区| 91免费精品国自产拍在线不卡| 99久久综合狠狠综合久久| 91在线精品一区二区三区| 欧美日韩视频在线观看一区二区三区| 一本到不卡精品视频在线观看| 欧美日韩一二三区| 2欧美一区二区三区在线观看视频| 久久综合九色综合97婷婷| 中文字幕佐山爱一区二区免费| 最好看的中文字幕久久| 石原莉奈一区二区三区在线观看 | 玉米视频成人免费看| 一区二区三区久久| 久久成人免费网站| www.欧美色图| 欧美疯狂做受xxxx富婆| 国产午夜精品理论片a级大结局| 一区av在线播放| 国产99一区视频免费| 欧美裸体一区二区三区| 亚洲视频资源在线| 国产成人aaa| 精品国产一区二区三区久久久蜜月| 亚洲女人的天堂| 成a人片亚洲日本久久| 日韩欧美中文一区| 亚洲aⅴ怡春院| 一本高清dvd不卡在线观看| 亚洲国产成人私人影院tom| 国产乱码精品1区2区3区| 日韩欧美国产综合一区 | 99久久精品99国产精品| 欧美xxxxxxxx| 图片区小说区国产精品视频| 欧洲中文字幕精品| 亚洲综合丝袜美腿| 欧美色图天堂网| 午夜激情综合网| 91精品国产高清一区二区三区蜜臀| 亚洲一区二区三区四区在线观看 | 亚洲一区二区在线播放相泽 | 国产视频一区二区在线| 成人中文字幕电影| 亚洲男人天堂av网| 欧美人牲a欧美精品| 日韩成人av影视| 国产无遮挡一区二区三区毛片日本| 精品亚洲aⅴ乱码一区二区三区| 欧美第一区第二区| 99re这里只有精品视频首页| 亚洲第一激情av| 精品久久久久久久一区二区蜜臀| 狠狠色丁香久久婷婷综合_中| 久久夜色精品国产噜噜av| 色噜噜狠狠色综合中国| 日韩avvvv在线播放| 亚洲欧美日韩国产手机在线| 日韩一区二区在线观看视频 | 久久午夜电影网| 91高清视频免费看| 国产成人免费视频一区| 亚洲福利一二三区| 亚洲视频免费在线观看| 久久网站最新地址| 日韩一区二区三区视频| 色诱亚洲精品久久久久久| 高清不卡一区二区| 蜜臂av日日欢夜夜爽一区| 亚洲不卡在线观看| 亚洲一区免费视频| 中文字幕av不卡| 国产肉丝袜一区二区| 欧美草草影院在线视频| 日韩亚洲欧美一区| 欧美日本在线播放| 欧美日韩小视频| 欧美精品在线视频| 欧美精品乱码久久久久久| 欧美丝袜丝nylons| 欧美一区二区三区啪啪| 欧美一区二区三区性视频| 欧美亚洲高清一区二区三区不卡| 在线亚洲人成电影网站色www| 91网站视频在线观看| 色婷婷亚洲综合| 欧美三级视频在线观看| 欧美精品一二三| 日韩欧美二区三区| 国产三级三级三级精品8ⅰ区| 欧美激情中文字幕| 一区二区三区视频在线观看| 粉嫩欧美一区二区三区高清影视| 国产精品一区二区三区99| av中文字幕在线不卡| 欧美三级日韩三级| 久久久亚洲精品石原莉奈| 国产精品日韩精品欧美在线| 亚洲一二三级电影| 久久超碰97中文字幕| 91香蕉视频黄| 欧美成人高清电影在线| 中文字幕综合网| 国产在线一区二区综合免费视频| 成人免费视频视频| 日韩欧美一二三| 亚洲精品少妇30p| 国产一区二区0| 91精品在线观看入口| 亚洲日本乱码在线观看| 国产成人av自拍| 精品国产91乱码一区二区三区| 一区二区三区鲁丝不卡| 不卡视频免费播放| 久久久久国产一区二区三区四区| 亚洲综合丝袜美腿| 91久久精品日日躁夜夜躁欧美| 欧美激情中文字幕| 国产成人午夜片在线观看高清观看| 精品视频一区 二区 三区| 亚洲精品免费播放| 99精品视频一区二区三区| 国产精品视频九色porn| 成人免费精品视频| 极品少妇一区二区| 在线播放视频一区| 久热成人在线视频| 久久先锋影音av鲁色资源网| 国产一区二区三区在线看麻豆| 欧美成人午夜电影| 国产成人超碰人人澡人人澡| 亚洲欧洲精品一区二区三区| 在线视频观看一区| 亚洲成人在线免费| 欧美本精品男人aⅴ天堂| 国产伦精品一区二区三区在线观看| 国产欧美一区二区精品忘忧草 | 日韩一区二区三区电影| 五月天一区二区| 亚洲精品一区二区三区99| 成人一级视频在线观看| 亚洲精品免费在线播放| 欧美xfplay| 欧美性猛交xxxx乱大交退制版| 麻豆一区二区在线| 一区二区三区四区蜜桃| 日韩午夜精品电影| 91传媒视频在线播放| 国内成人自拍视频| 亚洲国产精品人人做人人爽| 精品88久久久久88久久久| 91麻豆精品在线观看| 国产精品18久久久| 日韩成人精品在线观看| 亚洲人成伊人成综合网小说| 精品国产一区久久| 日韩欧美国产一二三区| 91精品办公室少妇高潮对白| 国产成a人无v码亚洲福利| 男女视频一区二区| 五月天激情综合网| 亚洲一区二区三区不卡国产欧美| 国产欧美一区二区精品性色| 精品国产免费一区二区三区四区| 欧美日韩国产区一| 欧美视频一区在线| 色八戒一区二区三区| 色呦呦一区二区三区| 不卡一区二区中文字幕| 99久久婷婷国产综合精品| 欧美在线制服丝袜| 色婷婷av一区二区三区大白胸| av亚洲产国偷v产偷v自拍| 成人h精品动漫一区二区三区| 日韩一区二区三区av| 国产精品一二三区| 国产成人av福利| 亚洲欧洲99久久| 亚洲美女偷拍久久| 日韩中文字幕1| 久久疯狂做爰流白浆xx| 国产永久精品大片wwwapp| 国产成人夜色高潮福利影视| 粉嫩一区二区三区在线看| 色哟哟欧美精品| 欧美日韩一卡二卡三卡 | 国产精品久久午夜| 亚洲一区二区免费视频| 久久精品久久精品| www.性欧美| 精品精品国产高清一毛片一天堂| 国产人伦精品一区二区| 午夜精品久久久久久久蜜桃app|