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

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

?? iccard0911.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;
}
//*******************************************************

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
www.亚洲色图| 国产精品视频观看| 日本一区二区免费在线观看视频| 亚洲女与黑人做爰| 激情成人午夜视频| 欧美精品久久一区| 亚洲精品综合在线| 成人性生交大合| 精品福利视频一区二区三区| 婷婷开心激情综合| 成人精品一区二区三区四区| 欧美videos大乳护士334| 亚洲国产日韩在线一区模特| 91论坛在线播放| 中文字幕乱码一区二区免费| 麻豆成人久久精品二区三区红| 欧洲av一区二区嗯嗯嗯啊| 1区2区3区国产精品| 福利视频网站一区二区三区| 亚洲精品在线观看网站| 免费一级片91| 337p日本欧洲亚洲大胆色噜噜| 蜜桃视频在线观看一区二区| 欧美日韩精品免费| 日韩精品午夜视频| 欧美精品一二三| 热久久一区二区| 日韩片之四级片| 裸体一区二区三区| 精品国产亚洲一区二区三区在线观看| 石原莉奈在线亚洲三区| 欧美日韩精品一区二区天天拍小说| 亚洲国产精品久久人人爱| 色婷婷国产精品综合在线观看| 亚洲欧美电影一区二区| 91麻豆国产在线观看| 亚洲一区二区三区四区在线观看 | youjizz国产精品| 国产精品国产三级国产aⅴ无密码| 51精品国自产在线| 日韩成人一区二区三区在线观看| 欧美一级艳片视频免费观看| 麻豆国产精品777777在线| 久久毛片高清国产| 99久久精品久久久久久清纯| 亚洲综合久久av| 日韩一区二区三区视频| 国产激情一区二区三区| 国产精品蜜臀在线观看| 色噜噜狠狠色综合欧洲selulu| 亚洲美女一区二区三区| 91国内精品野花午夜精品| 天堂午夜影视日韩欧美一区二区| 日韩三级电影网址| 成人av资源在线| 一区二区三区成人| 日韩精品一区国产麻豆| av网站一区二区三区| 亚洲bt欧美bt精品| 精品国产一二三区| 91福利国产成人精品照片| 三级一区在线视频先锋| 国产女主播在线一区二区| 色综合久久久久网| 久久99精品视频| 亚洲欧美日韩一区| 欧美xxx久久| 欧洲人成人精品| 国产一区在线观看麻豆| 亚洲柠檬福利资源导航| 精品国内片67194| 色综合天天综合给合国产| 日本美女一区二区三区视频| 国产精品国产三级国产普通话99| 欧美一区二区三区思思人| 成人激情电影免费在线观看| 日韩精品电影在线观看| 国产日韩欧美精品在线| 91精品国产综合久久久久久漫画| 成人国产电影网| 久久 天天综合| 亚洲午夜日本在线观看| 中文字幕亚洲一区二区av在线| 日韩一卡二卡三卡四卡| 91传媒视频在线播放| 成a人片亚洲日本久久| 蜜臀av性久久久久av蜜臀妖精| 亚洲免费av高清| 中文字幕在线一区免费| 久久一日本道色综合| 欧美老肥妇做.爰bbww视频| 91蜜桃网址入口| 成人app在线| 国产91在线观看| 韩国在线一区二区| 精品影视av免费| 蜜臀av一区二区在线免费观看| 亚洲成在人线免费| 亚洲资源在线观看| 一区二区日韩av| 一区二区久久久久| 亚洲视频精选在线| 成人欧美一区二区三区黑人麻豆| 国产偷国产偷亚洲高清人白洁| 欧美电影免费提供在线观看| 亚洲男帅同性gay1069| 国产精品美女久久久久久2018| 欧美成人伊人久久综合网| 日韩一区二区三区精品视频| 欧美一区二区三区啪啪| 日韩一区二区高清| 欧美一级片免费看| 欧美xingq一区二区| 精品日韩欧美在线| 久久久噜噜噜久噜久久综合| 久久香蕉国产线看观看99| 久久久久久久av麻豆果冻| 国产清纯美女被跳蛋高潮一区二区久久w| 久久综合色一综合色88| 国产亚洲欧美日韩在线一区| 欧美高清在线一区| 亚洲免费毛片网站| 亚洲成av人在线观看| 五月婷婷色综合| 精油按摩中文字幕久久| 视频一区二区中文字幕| 美女脱光内衣内裤视频久久影院| 老司机精品视频在线| 国产成人一区在线| av在线这里只有精品| 欧美中文字幕一区| 欧美一区二区视频网站| 久久无码av三级| 亚洲色图欧美在线| 亚洲v中文字幕| 国产一区在线精品| 色综合咪咪久久| 欧美一激情一区二区三区| 国产欧美日韩精品在线| 亚洲精品国产第一综合99久久| 日本视频一区二区三区| 国产激情偷乱视频一区二区三区| 91热门视频在线观看| 日韩欧美在线影院| 国产精品国产馆在线真实露脸| 亚洲第一主播视频| 国产精品99久久久| 欧美日韩一区在线观看| 久久综合色一综合色88| 亚洲精品国产精华液| 久久aⅴ国产欧美74aaa| 91麻豆文化传媒在线观看| 日韩免费成人网| 一区二区三区四区乱视频| 国产一区二区三区| 欧美图区在线视频| 国产精品女主播av| 久久成人免费网站| 在线一区二区视频| 国产精品蜜臀av| 韩日欧美一区二区三区| 欧美日韩国产高清一区二区| 亚洲国产岛国毛片在线| 日本v片在线高清不卡在线观看| 91亚洲精品久久久蜜桃网站| 精品乱码亚洲一区二区不卡| 一区二区三区四区高清精品免费观看| 国内久久精品视频| 欧美精三区欧美精三区| 日韩毛片精品高清免费| 国产一区二区看久久| 欧美日韩国产综合久久 | 国产日韩欧美激情| 亚洲a一区二区| 一本久久精品一区二区| 国产午夜精品一区二区三区嫩草| 蜜桃精品视频在线观看| 欧美中文一区二区三区| 国产精品不卡一区| 国产成人午夜视频| 日韩欧美一区中文| 亚洲国产一区二区a毛片| 色一情一乱一乱一91av| 中文字幕一区二区三| 国产成人av一区二区三区在线观看| 宅男在线国产精品| 亚洲v日本v欧美v久久精品| 91精品办公室少妇高潮对白| 国产精品伦理一区二区| 国产精品一区二区在线观看不卡 | 欧美疯狂做受xxxx富婆| 亚洲一区欧美一区| 91福利在线观看| 一区二区欧美视频| 在线免费亚洲电影| 亚洲国产美女搞黄色| 欧美中文字幕一区二区三区| 亚洲成人免费看| 91精品久久久久久久久99蜜臂| 日精品一区二区三区|